Merge pull request #88 from MilosKozak/dev

Dev
This commit is contained in:
Roumen Georgiev 2019-12-05 15:06:15 +02:00 committed by GitHub
commit 6c8a5aee47
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
79 changed files with 955 additions and 473 deletions

View file

@ -225,8 +225,8 @@ dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.google.android.gms:play-services-wearable:17.0.0' implementation 'com.google.android.gms:play-services-wearable:17.0.0'
implementation 'com.google.firebase:firebase-core:17.2.0' implementation 'com.google.firebase:firebase-core:17.2.1'
implementation("com.crashlytics.sdk.android:crashlytics:2.9.9@aar") { implementation('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') {
transitive = true; transitive = true;
} }
@ -234,11 +234,11 @@ dependencies {
implementation 'androidx.legacy:legacy-support-v13:1.0.0' implementation 'androidx.legacy:legacy-support-v13:1.0.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.gridlayout:gridlayout:1.0.0' implementation 'androidx.gridlayout:gridlayout:1.0.0'
implementation 'com.google.android.material:material:1.0.0' implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.percentlayout:percentlayout:1.0.0' implementation 'androidx.percentlayout:percentlayout:1.0.0'
implementation "com.wdullaer:materialdatetimepicker:2.3.0" implementation 'com.wdullaer:materialdatetimepicker:4.2.3'
implementation "io.reactivex.rxjava2:rxandroid:2.1.1" implementation "io.reactivex.rxjava2:rxandroid:2.1.1"
@ -247,11 +247,11 @@ dependencies {
implementation("com.github.tony19:logback-android-classic:1.1.1-6") { implementation("com.github.tony19:logback-android-classic:1.1.1-6") {
exclude group: "com.google.android", module: "android" exclude group: "com.google.android", module: "android"
} }
implementation "org.apache.commons:commons-lang3:3.7" implementation "org.apache.commons:commons-lang3:3.9"
implementation "org.slf4j:slf4j-api:1.7.21" implementation "org.slf4j:slf4j-api:1.7.29"
// Graphview cannot be upgraded // Graphview cannot be upgraded
implementation "com.jjoe64:graphview:4.0.1" implementation "com.jjoe64:graphview:4.0.1"
implementation "com.joanzapata.iconify:android-iconify-fontawesome:2.1.1" implementation "com.joanzapata.iconify:android-iconify-fontawesome:2.2.2"
implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation(name: "android-edittext-validator-v1.3.4-mod", ext: "aar") implementation(name: "android-edittext-validator-v1.3.4-mod", ext: "aar")
implementation 'com.madgag.spongycastle:core:1.58.0.0' implementation 'com.madgag.spongycastle:core:1.58.0.0'
@ -263,24 +263,23 @@ dependencies {
// excluding org.json which is provided by Android // excluding org.json which is provided by Android
exclude group: "org.json", module: "json" exclude group: "org.json", module: "json"
} }
implementation "com.google.code.gson:gson:2.8.5" implementation "com.google.code.gson:gson:2.8.6"
implementation "com.google.guava:guava:24.1-jre" implementation "com.google.guava:guava:24.1-jre"
implementation "net.danlew:android.joda:2.9.9.1" implementation "net.danlew:android.joda:2.10.3"
implementation "uk.com.robust-it:cloning:1.9.9"
implementation 'org.mozilla:rhino:1.7.7.2' implementation 'org.mozilla:rhino:1.7.11'
implementation 'com.github.DavidProdinger:weekdays-selector:1.1.0' implementation 'com.github.DavidProdinger:weekdays-selector:1.1.0'
testImplementation "junit:junit:4.12" testImplementation "junit:junit:4.12"
testImplementation "org.json:json:20140107" testImplementation "org.json:json:20190722"
testImplementation "org.mockito:mockito-core:2.8.47" testImplementation "org.mockito:mockito-core:2.8.47"
testImplementation "org.powermock:powermock-api-mockito2:${powermockVersion}" testImplementation "org.powermock:powermock-api-mockito2:${powermockVersion}"
testImplementation "org.powermock:powermock-module-junit4-rule-agent:${powermockVersion}" testImplementation "org.powermock:powermock-module-junit4-rule-agent:${powermockVersion}"
testImplementation "org.powermock:powermock-module-junit4-rule:${powermockVersion}" testImplementation "org.powermock:powermock-module-junit4-rule:${powermockVersion}"
testImplementation "org.powermock:powermock-module-junit4:${powermockVersion}" testImplementation "org.powermock:powermock-module-junit4:${powermockVersion}"
testImplementation "joda-time:joda-time:2.9.9" testImplementation "joda-time:joda-time:2.10.5"
testImplementation("com.google.truth:truth:0.39") { testImplementation("com.google.truth:truth:0.39") {
exclude group: "com.google.guava", module: "guava" exclude group: "com.google.guava", module: "guava"
} }
@ -300,11 +299,11 @@ dependencies {
// new for tidepool // new for tidepool
implementation 'com.squareup.okhttp3:okhttp:3.10.0' implementation 'com.squareup.okhttp3:okhttp:4.2.2'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0' implementation 'com.squareup.okhttp3:logging-interceptor:4.2.2'
implementation "com.squareup.retrofit2:retrofit:2.4.0" implementation "com.squareup.retrofit2:retrofit:2.6.2"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.4.0" implementation "com.squareup.retrofit2:adapter-rxjava2:2.6.2"
implementation "com.squareup.retrofit2:converter-gson:2.4.0" implementation "com.squareup.retrofit2:converter-gson:2.6.2"
} }

View file

@ -37,12 +37,10 @@ import com.joanzapata.iconify.fonts.FontAwesomeModule;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.activities.AgreementActivity;
import info.nightscout.androidaps.activities.HistoryBrowseActivity; import info.nightscout.androidaps.activities.HistoryBrowseActivity;
import info.nightscout.androidaps.activities.NoSplashAppCompatActivity; import info.nightscout.androidaps.activities.NoSplashAppCompatActivity;
import info.nightscout.androidaps.activities.PreferencesActivity; import info.nightscout.androidaps.activities.PreferencesActivity;
import info.nightscout.androidaps.activities.SingleFragmentActivity; import info.nightscout.androidaps.activities.SingleFragmentActivity;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventAppExit;
import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.events.EventRebuildTabs; import info.nightscout.androidaps.events.EventRebuildTabs;
@ -51,7 +49,6 @@ import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.L; import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin; import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin;
import info.nightscout.androidaps.plugins.bus.RxBus; import info.nightscout.androidaps.plugins.bus.RxBus;
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.constraints.versionChecker.VersionCheckerUtilsKt; import info.nightscout.androidaps.plugins.constraints.versionChecker.VersionCheckerUtilsKt;
import info.nightscout.androidaps.plugins.general.nsclient.data.NSSettingsStatus; import info.nightscout.androidaps.plugins.general.nsclient.data.NSSettingsStatus;
import info.nightscout.androidaps.setupwizard.SetupWizardActivity; import info.nightscout.androidaps.setupwizard.SetupWizardActivity;
@ -59,7 +56,6 @@ import info.nightscout.androidaps.tabs.TabPageAdapter;
import info.nightscout.androidaps.utils.AndroidPermission; import info.nightscout.androidaps.utils.AndroidPermission;
import info.nightscout.androidaps.utils.FabricPrivacy; import info.nightscout.androidaps.utils.FabricPrivacy;
import info.nightscout.androidaps.utils.LocaleHelper; import info.nightscout.androidaps.utils.LocaleHelper;
import info.nightscout.androidaps.utils.OKDialog;
import info.nightscout.androidaps.utils.PasswordProtection; import info.nightscout.androidaps.utils.PasswordProtection;
import info.nightscout.androidaps.utils.SP; import info.nightscout.androidaps.utils.SP;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
@ -141,11 +137,9 @@ public class MainActivity extends NoSplashAppCompatActivity {
.subscribe(this::processPreferenceChange, FabricPrivacy::logException) .subscribe(this::processPreferenceChange, FabricPrivacy::logException)
); );
if (!SP.getBoolean(R.string.key_setupwizard_processed, false)) { if (!SP.getBoolean(R.string.key_setupwizard_processed, false) || !SP.contains(R.string.key_units)) {
Intent intent = new Intent(this, SetupWizardActivity.class); Intent intent = new Intent(this, SetupWizardActivity.class);
startActivity(intent); startActivity(intent);
} else {
checkEula();
} }
AndroidPermission.notifyForStoragePermission(this); AndroidPermission.notifyForStoragePermission(this);
@ -237,16 +231,6 @@ public class MainActivity extends NoSplashAppCompatActivity {
} }
} }
private void checkEula() {
//SP.removeBoolean(R.string.key_i_understand);
boolean IUnderstand = SP.getBoolean(R.string.key_i_understand, false);
if (!IUnderstand) {
Intent intent = new Intent(getApplicationContext(), AgreementActivity.class);
startActivity(intent);
finish();
}
}
private void doMigrations() { private void doMigrations() {
// guarantee that the unreachable threshold is at least 30 and of type String // guarantee that the unreachable threshold is at least 30 and of type String
@ -255,11 +239,6 @@ public class MainActivity extends NoSplashAppCompatActivity {
SP.remove(R.string.key_pump_unreachable_threshold); SP.remove(R.string.key_pump_unreachable_threshold);
if (unreachable_threshold < 30) unreachable_threshold = 30; if (unreachable_threshold < 30) unreachable_threshold = 30;
SP.putString(R.string.key_pump_unreachable_threshold, Integer.toString(unreachable_threshold)); SP.putString(R.string.key_pump_unreachable_threshold, Integer.toString(unreachable_threshold));
if (!SP.contains(R.string.key_units)) {
Intent intent = new Intent(this, SetupWizardActivity.class);
startActivity(intent);
}
} }

View file

@ -1,44 +0,0 @@
package info.nightscout.androidaps.activities;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import info.nightscout.androidaps.MainActivity;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.utils.SP;
public class AgreementActivity extends NoSplashActivity {
boolean IUnderstand;
CheckBox agreeCheckBox;
Button saveButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_agreement);
IUnderstand = SP.getBoolean(R.string.key_i_understand, false);
setContentView(R.layout.activity_agreement);
agreeCheckBox = (CheckBox)findViewById(R.id.agreementCheckBox);
agreeCheckBox.setChecked(IUnderstand);
saveButton = (Button)findViewById(R.id.agreementSaveButton);
addListenerOnButton();
}
public void addListenerOnButton() {
saveButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
SP.putBoolean(R.string.key_i_understand, agreeCheckBox.isChecked());
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
finish();
}
});
}
}

View file

@ -45,7 +45,7 @@ import info.nightscout.androidaps.utils.T;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.CompositeDisposable;
public class HistoryBrowseActivity extends NoSplashActivity { public class HistoryBrowseActivity extends NoSplashAppCompatActivity {
private static Logger log = LoggerFactory.getLogger(HistoryBrowseActivity.class); private static Logger log = LoggerFactory.getLogger(HistoryBrowseActivity.class);
private CompositeDisposable disposable = new CompositeDisposable(); private CompositeDisposable disposable = new CompositeDisposable();
@ -150,7 +150,7 @@ public class HistoryBrowseActivity extends NoSplashActivity {
); );
dpd.setThemeDark(true); dpd.setThemeDark(true);
dpd.dismissOnPause(true); dpd.dismissOnPause(true);
dpd.show(getFragmentManager(), "Datepickerdialog"); dpd.show(getSupportFragmentManager(), "Datepickerdialog");
}); });
bgGraph.getGridLabelRenderer().setGridColor(MainApp.gc(R.color.graphgrid)); bgGraph.getGridLabelRenderer().setGridColor(MainApp.gc(R.color.graphgrid));

View file

@ -1,13 +0,0 @@
package info.nightscout.androidaps.activities
import android.app.Activity
import android.os.Bundle
import info.nightscout.androidaps.R
open class NoSplashActivity : Activity() {
public override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.AppTheme_NoActionBar)
super.onCreate(savedInstanceState)
}
}

View file

@ -1,12 +1,18 @@
package info.nightscout.androidaps.activities package info.nightscout.androidaps.activities
import android.content.Context
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import info.nightscout.androidaps.R import info.nightscout.androidaps.R
import info.nightscout.androidaps.utils.LocaleHelper
open class NoSplashAppCompatActivity : AppCompatActivity() { open class NoSplashAppCompatActivity : AppCompatActivity() {
public override fun onCreate(savedInstanceState: Bundle?) { public override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.AppTheme_NoActionBar) setTheme(R.style.AppTheme_NoActionBar)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
} }
public override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(LocaleHelper.wrap(newBase))
}
} }

View file

@ -1,5 +1,6 @@
package info.nightscout.androidaps.activities; package info.nightscout.androidaps.activities;
import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.preference.EditTextPreference; import android.preference.EditTextPreference;
@ -47,6 +48,7 @@ import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref0Plugin;
import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin; import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin;
import info.nightscout.androidaps.plugins.sensitivity.SensitivityWeightedAveragePlugin; import info.nightscout.androidaps.plugins.sensitivity.SensitivityWeightedAveragePlugin;
import info.nightscout.androidaps.plugins.source.SourceDexcomPlugin; import info.nightscout.androidaps.plugins.source.SourceDexcomPlugin;
import info.nightscout.androidaps.utils.LocaleHelper;
import info.nightscout.androidaps.utils.OKDialog; import info.nightscout.androidaps.utils.OKDialog;
import info.nightscout.androidaps.utils.SP; import info.nightscout.androidaps.utils.SP;
import info.nightscout.androidaps.utils.SafeParse; import info.nightscout.androidaps.utils.SafeParse;
@ -66,6 +68,11 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this); PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
} }
@Override
public void attachBaseContext(Context newBase) {
super.attachBaseContext(LocaleHelper.INSTANCE.wrap(newBase));
}
@Override @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
RxBus.INSTANCE.send(new EventPreferenceChange(key)); RxBus.INSTANCE.send(new EventPreferenceChange(key));
@ -122,6 +129,7 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre
} }
} }
} }
if (pref != null)
adjustUnitDependentPrefs(pref); adjustUnitDependentPrefs(pref);
} }

View file

@ -54,7 +54,7 @@ import info.nightscout.androidaps.utils.SafeParse;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.CompositeDisposable;
public class TDDStatsActivity extends NoSplashActivity { public class TDDStatsActivity extends NoSplashAppCompatActivity {
private static Logger log = LoggerFactory.getLogger(TDDStatsActivity.class); private static Logger log = LoggerFactory.getLogger(TDDStatsActivity.class);
private CompositeDisposable disposable = new CompositeDisposable(); private CompositeDisposable disposable = new CompositeDisposable();

View file

@ -1,7 +1,5 @@
package info.nightscout.androidaps.data; package info.nightscout.androidaps.data;
import com.rits.cloning.Cloner;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -37,8 +35,19 @@ public class IobTotal implements DataPointWithLabelInterface {
public IobTotal copy() { public IobTotal copy() {
Cloner cloner = new Cloner(); IobTotal i = new IobTotal(time);
return cloner.deepClone(this); i.iob = iob;
i.activity = activity;
i.bolussnooze = bolussnooze;
i.basaliob = basaliob;
i.netbasalinsulin = netbasalinsulin;
i.hightempinsulin = hightempinsulin;
i.lastBolusTime = lastBolusTime;
if (iobWithZeroTemp != null) i.iobWithZeroTemp = iobWithZeroTemp.copy();
i.netInsulin = netInsulin;
i.netRatio = netRatio;
i.extendedBolusInsulin = extendedBolusInsulin;
return i;
} }
public IobTotal(long time) { public IobTotal(long time) {
@ -137,7 +146,7 @@ public class IobTotal implements DataPointWithLabelInterface {
// DataPoint interface // DataPoint interface
int color; private int color;
@Override @Override
public double getX() { public double getX() {

View file

@ -7,6 +7,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.Constants;
@ -19,10 +20,11 @@ import info.nightscout.androidaps.plugins.general.overview.OverviewPlugin;
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface; import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface;
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries; import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries;
import info.nightscout.androidaps.utils.DecimalFormatter; import info.nightscout.androidaps.utils.DecimalFormatter;
import info.nightscout.androidaps.utils.T;
@DatabaseTable(tableName = DatabaseHelper.DATABASE_BGREADINGS) @DatabaseTable(tableName = DatabaseHelper.DATABASE_BGREADINGS)
public class BgReading implements DataPointWithLabelInterface { public class BgReading implements DataPointWithLabelInterface {
private static Logger log = LoggerFactory.getLogger(L.DATABASE); private static Logger log = LoggerFactory.getLogger(L.GLUCOSE);
@DatabaseField(id = true) @DatabaseField(id = true)
public long date; public long date;
@ -73,9 +75,10 @@ public class BgReading implements DataPointWithLabelInterface {
public String directionToSymbol() { public String directionToSymbol() {
String symbol = ""; String symbol = "";
if (direction == null) { if (direction == null)
symbol = "??"; direction = calculateDirection();
} else if (direction.compareTo("DoubleDown") == 0) {
if (direction.compareTo("DoubleDown") == 0) {
symbol = "\u21ca"; symbol = "\u21ca";
} else if (direction.compareTo("SingleDown") == 0) { } else if (direction.compareTo("SingleDown") == 0) {
symbol = "\u2193"; symbol = "\u2193";
@ -95,18 +98,13 @@ public class BgReading implements DataPointWithLabelInterface {
return symbol; return symbol;
} }
public static boolean isSlopeNameInvalid(String direction) { private static boolean isSlopeNameInvalid(String direction) {
if (direction.compareTo("NOT_COMPUTABLE") == 0 || return direction.compareTo("NOT_COMPUTABLE") == 0 ||
direction.compareTo("NOT COMPUTABLE") == 0 || direction.compareTo("NOT COMPUTABLE") == 0 ||
direction.compareTo("OUT_OF_RANGE") == 0 || direction.compareTo("OUT_OF_RANGE") == 0 ||
direction.compareTo("OUT OF RANGE") == 0 || direction.compareTo("OUT OF RANGE") == 0 ||
direction.compareTo("NONE") == 0 || direction.compareTo("NONE") == 0 ||
direction.compareTo("NotComputable") == 0 direction.compareTo("NotComputable") == 0;
) {
return true;
} else {
return false;
}
} }
@ -123,6 +121,7 @@ public class BgReading implements DataPointWithLabelInterface {
public boolean isDataChanging(BgReading other) { public boolean isDataChanging(BgReading other) {
if (date != other.date) { if (date != other.date) {
if (L.isEnabled(L.GLUCOSE))
log.error("Comparing different"); log.error("Comparing different");
return false; return false;
} }
@ -133,6 +132,7 @@ public class BgReading implements DataPointWithLabelInterface {
public boolean isEqual(BgReading other) { public boolean isEqual(BgReading other) {
if (date != other.date) { if (date != other.date) {
if (L.isEnabled(L.GLUCOSE))
log.error("Comparing different"); log.error("Comparing different");
return false; return false;
} }
@ -149,6 +149,7 @@ public class BgReading implements DataPointWithLabelInterface {
public void copyFrom(BgReading other) { public void copyFrom(BgReading other) {
if (date != other.date) { if (date != other.date) {
if (L.isEnabled(L.GLUCOSE))
log.error("Copying different"); log.error("Copying different");
return; return;
} }
@ -245,4 +246,53 @@ public class BgReading implements DataPointWithLabelInterface {
return isaCOBPrediction || isCOBPrediction || isIOBPrediction || isUAMPrediction || isZTPrediction; return isaCOBPrediction || isCOBPrediction || isIOBPrediction || isUAMPrediction || isZTPrediction;
} }
// Copied from xDrip+
String calculateDirection() {
// Rework to get bgreaings from internal DB and calculate on that base
List<BgReading> bgReadingsList = MainApp.getDbHelper().getAllBgreadingsDataFromTime(this.date - T.mins(10).msecs(), false);
if (bgReadingsList == null || bgReadingsList.size() < 2)
return "NONE";
BgReading current = bgReadingsList.get(1);
BgReading previous = bgReadingsList.get(0);
if (bgReadingsList.get(1).date < bgReadingsList.get(0).date) {
current = bgReadingsList.get(0);
previous = bgReadingsList.get(1);
}
double slope;
// Avoid division by 0
if (current.date == previous.date)
slope = 0;
else
slope = (previous.value - current.value) / (previous.date - current.date);
if (L.isEnabled(L.GLUCOSE))
log.debug("Slope is :" + slope + " delta " + (previous.value - current.value) + " date difference " + (current.date - previous.date));
double slope_by_minute = slope * 60000;
String arrow = "NONE";
if (slope_by_minute <= (-3.5)) {
arrow = "DoubleDown";
} else if (slope_by_minute <= (-2)) {
arrow = "SingleDown";
} else if (slope_by_minute <= (-1)) {
arrow = "FortyFiveDown";
} else if (slope_by_minute <= (1)) {
arrow = "Flat";
} else if (slope_by_minute <= (2)) {
arrow = "FortyFiveUp";
} else if (slope_by_minute <= (3.5)) {
arrow = "SingleUp";
} else if (slope_by_minute <= (40)) {
arrow = "DoubleUp";
}
if (L.isEnabled(L.GLUCOSE))
log.debug("Direction set to: " + arrow);
return arrow;
}
} }

View file

@ -5,10 +5,14 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import info.nightscout.androidaps.R import info.nightscout.androidaps.R
import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.plugins.bus.RxBus
import info.nightscout.androidaps.plugins.general.automation.dialogs.EditEventDialog import info.nightscout.androidaps.plugins.general.automation.dialogs.EditEventDialog
import info.nightscout.androidaps.plugins.general.automation.dragHelpers.OnStartDragListener
import info.nightscout.androidaps.plugins.general.automation.dragHelpers.SimpleItemTouchHelperCallback
import info.nightscout.androidaps.plugins.general.automation.events.EventAutomationDataChanged import info.nightscout.androidaps.plugins.general.automation.events.EventAutomationDataChanged
import info.nightscout.androidaps.plugins.general.automation.events.EventAutomationUpdateGui import info.nightscout.androidaps.plugins.general.automation.events.EventAutomationUpdateGui
import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.FabricPrivacy
@ -17,11 +21,14 @@ import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
import kotlinx.android.synthetic.main.automation_fragment.* import kotlinx.android.synthetic.main.automation_fragment.*
class AutomationFragment : Fragment() {
class AutomationFragment : Fragment(), OnStartDragListener {
private var disposable: CompositeDisposable = CompositeDisposable() private var disposable: CompositeDisposable = CompositeDisposable()
private var eventListAdapter: EventListAdapter? = null private var eventListAdapter: EventListAdapter? = null
private var itemTouchHelper: ItemTouchHelper? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.automation_fragment, container, false) return inflater.inflate(R.layout.automation_fragment, container, false)
} }
@ -29,7 +36,7 @@ class AutomationFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
eventListAdapter = EventListAdapter(AutomationPlugin.automationEvents, fragmentManager, activity) eventListAdapter = EventListAdapter(AutomationPlugin.automationEvents, fragmentManager, activity, this)
automation_eventListView.layoutManager = LinearLayoutManager(context) automation_eventListView.layoutManager = LinearLayoutManager(context)
automation_eventListView.adapter = eventListAdapter automation_eventListView.adapter = eventListAdapter
@ -42,6 +49,10 @@ class AutomationFragment : Fragment() {
fragmentManager?.let { dialog.show(it, "EditEventDialog") } fragmentManager?.let { dialog.show(it, "EditEventDialog") }
} }
val callback: ItemTouchHelper.Callback = SimpleItemTouchHelperCallback(eventListAdapter!!)
itemTouchHelper = ItemTouchHelper(callback)
itemTouchHelper?.attachToRecyclerView(automation_eventListView)
} }
@Synchronized @Synchronized
@ -81,4 +92,8 @@ class AutomationFragment : Fragment() {
automation_logView?.text = sb.toString() automation_logView?.text = sb.toString()
} }
override fun onStartDrag(viewHolder: RecyclerView.ViewHolder) {
itemTouchHelper?.startDrag(viewHolder);
}
} }

View file

@ -161,7 +161,7 @@ object AutomationPlugin : PluginBase(PluginDescription()
private fun processActions() { private fun processActions() {
if (!isEnabled(PluginType.GENERAL)) if (!isEnabled(PluginType.GENERAL))
return return
if (LoopPlugin.getPlugin().isSuspended) { if (LoopPlugin.getPlugin().isSuspended || !LoopPlugin.getPlugin().isEnabled(PluginType.LOOP)) {
if (L.isEnabled(L.AUTOMATION)) if (L.isEnabled(L.AUTOMATION))
log.debug("Loop deactivated") log.debug("Loop deactivated")
return return

View file

@ -1,9 +1,12 @@
package info.nightscout.androidaps.plugins.general.automation; package info.nightscout.androidaps.plugins.general.automation;
import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.graphics.Color;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.CheckBox; import android.widget.CheckBox;
@ -17,6 +20,7 @@ import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -25,19 +29,26 @@ import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.bus.RxBus; import info.nightscout.androidaps.plugins.bus.RxBus;
import info.nightscout.androidaps.plugins.general.automation.actions.Action; import info.nightscout.androidaps.plugins.general.automation.actions.Action;
import info.nightscout.androidaps.plugins.general.automation.dialogs.EditEventDialog; import info.nightscout.androidaps.plugins.general.automation.dialogs.EditEventDialog;
import info.nightscout.androidaps.plugins.general.automation.dragHelpers.ItemTouchHelperAdapter;
import info.nightscout.androidaps.plugins.general.automation.dragHelpers.ItemTouchHelperViewHolder;
import info.nightscout.androidaps.plugins.general.automation.dragHelpers.OnStartDragListener;
import info.nightscout.androidaps.plugins.general.automation.events.EventAutomationDataChanged; import info.nightscout.androidaps.plugins.general.automation.events.EventAutomationDataChanged;
import info.nightscout.androidaps.plugins.general.automation.events.EventAutomationUpdateGui;
import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerConnector; import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerConnector;
import info.nightscout.androidaps.utils.OKDialog; import info.nightscout.androidaps.utils.OKDialog;
class EventListAdapter extends RecyclerView.Adapter<EventListAdapter.ViewHolder> { class EventListAdapter extends RecyclerView.Adapter<EventListAdapter.ViewHolder> implements ItemTouchHelperAdapter {
private final List<AutomationEvent> eventList; private final List<AutomationEvent> eventList;
private final FragmentManager fragmentManager; private final FragmentManager fragmentManager;
private final Activity activity; private final Activity activity;
EventListAdapter(List<AutomationEvent> events, FragmentManager fragmentManager, Activity activity) { private final OnStartDragListener mDragStartListener;
EventListAdapter(List<AutomationEvent> events, FragmentManager fragmentManager, Activity activity, OnStartDragListener dragStartListener) {
this.eventList = events; this.eventList = events;
this.fragmentManager = fragmentManager; this.fragmentManager = fragmentManager;
this.activity = activity; this.activity = activity;
mDragStartListener = dragStartListener;
} }
@NonNull @NonNull
@ -54,6 +65,7 @@ class EventListAdapter extends RecyclerView.Adapter<EventListAdapter.ViewHolder>
layout.addView(iv); layout.addView(iv);
} }
@SuppressLint("ClickableViewAccessibility")
@Override @Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) { public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final AutomationEvent event = eventList.get(position); final AutomationEvent event = eventList.get(position);
@ -91,16 +103,10 @@ class EventListAdapter extends RecyclerView.Adapter<EventListAdapter.ViewHolder>
RxBus.INSTANCE.send(new EventAutomationDataChanged()); RxBus.INSTANCE.send(new EventAutomationDataChanged());
}); });
// remove event
holder.iconTrash.setOnClickListener(v ->
OKDialog.showConfirmation(activity, MainApp.gs(R.string.removerecord) + " " + event.getTitle(), () -> {
eventList.remove(event);
RxBus.INSTANCE.send(new EventAutomationDataChanged());
})
);
// edit event // edit event
holder.rootLayout.setOnClickListener(v -> { holder.rootLayout.setOnClickListener(v ->
{
//EditEventDialog dialog = EditEventDialog.Companion.newInstance(event, false); //EditEventDialog dialog = EditEventDialog.Companion.newInstance(event, false);
EditEventDialog dialog = new EditEventDialog(); EditEventDialog dialog = new EditEventDialog();
Bundle args = new Bundle(); Bundle args = new Bundle();
@ -110,6 +116,17 @@ class EventListAdapter extends RecyclerView.Adapter<EventListAdapter.ViewHolder>
if (fragmentManager != null) if (fragmentManager != null)
dialog.show(fragmentManager, "EditEventDialog"); dialog.show(fragmentManager, "EditEventDialog");
}); });
// Start a drag whenever the handle view it touched
holder.iconSort.setOnTouchListener((v, motionEvent) ->
{
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
mDragStartListener.onStartDrag(holder);
return true;
}
return v.onTouchEvent(motionEvent);
});
} }
@Override @Override
@ -117,12 +134,33 @@ class EventListAdapter extends RecyclerView.Adapter<EventListAdapter.ViewHolder>
return eventList.size(); return eventList.size();
} }
static class ViewHolder extends RecyclerView.ViewHolder { @Override
public boolean onItemMove(int fromPosition, int toPosition) {
Collections.swap(eventList, fromPosition, toPosition);
notifyItemMoved(fromPosition, toPosition);
RxBus.INSTANCE.send(new EventAutomationDataChanged());
return true;
}
@Override
public void onItemDismiss(int position) {
OKDialog.showConfirmation(activity, MainApp.gs(R.string.removerecord) + " " + eventList.get(position).getTitle(),
() -> {
eventList.remove(position);
notifyItemRemoved(position);
RxBus.INSTANCE.send(new EventAutomationDataChanged());
RxBus.INSTANCE.send(new EventAutomationUpdateGui());
}, () -> {
RxBus.INSTANCE.send(new EventAutomationUpdateGui());
});
}
static class ViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder {
final RelativeLayout rootLayout; final RelativeLayout rootLayout;
final LinearLayout iconLayout; final LinearLayout iconLayout;
final TextView eventTitle; final TextView eventTitle;
final Context context; final Context context;
final ImageView iconTrash; final ImageView iconSort;
final CheckBox enabled; final CheckBox enabled;
ViewHolder(View view, Context context) { ViewHolder(View view, Context context) {
@ -131,8 +169,18 @@ class EventListAdapter extends RecyclerView.Adapter<EventListAdapter.ViewHolder>
eventTitle = view.findViewById(R.id.viewEventTitle); eventTitle = view.findViewById(R.id.viewEventTitle);
rootLayout = view.findViewById(R.id.rootLayout); rootLayout = view.findViewById(R.id.rootLayout);
iconLayout = view.findViewById(R.id.iconLayout); iconLayout = view.findViewById(R.id.iconLayout);
iconTrash = view.findViewById(R.id.iconTrash); iconSort = view.findViewById(R.id.iconSort);
enabled = view.findViewById(R.id.automation_enabled); enabled = view.findViewById(R.id.automation_enabled);
} }
@Override
public void onItemSelected() {
itemView.setBackgroundColor(Color.LTGRAY);
}
@Override
public void onItemClear() {
itemView.setBackgroundColor(MainApp.gc(R.color.ribbonDefault));
}
} }
} }

View file

@ -0,0 +1,33 @@
package info.nightscout.androidaps.plugins.general.automation.dragHelpers
interface ItemTouchHelperAdapter {
/**
* Called when an item has been dragged far enough to trigger a move. This is called every time
* an item is shifted, and **not** at the end of a "drop" event.<br></br>
* <br></br>
* Implementations should call [RecyclerView.Adapter.notifyItemMoved] after
* adjusting the underlying data to reflect this move.
*
* @param fromPosition The start position of the moved item.
* @param toPosition Then resolved position of the moved item.
* @return True if the item was moved to the new adapter position.
*
* @see RecyclerView.getAdapterPositionFor
* @see RecyclerView.ViewHolder.getAdapterPosition
*/
fun onItemMove(fromPosition: Int, toPosition: Int): Boolean
/**
* Called when an item has been dismissed by a swipe.<br></br>
* <br></br>
* Implementations should call [RecyclerView.Adapter.notifyItemRemoved] after
* adjusting the underlying data to reflect this removal.
*
* @param position The position of the item dismissed.
*
* @see RecyclerView.getAdapterPositionFor
* @see RecyclerView.ViewHolder.getAdapterPosition
*/
fun onItemDismiss(position: Int)
}

View file

@ -0,0 +1,20 @@
package info.nightscout.androidaps.plugins.general.automation.dragHelpers
/**
* Interface to notify an item ViewHolder of relevant callbacks from [ ].
*
* @author Paul Burke (ipaulpro)
*/
interface ItemTouchHelperViewHolder {
/**
* Called when the [ItemTouchHelper] first registers an item as being moved or swiped.
* Implementations should update the item view to indicate it's active state.
*/
fun onItemSelected()
/**
* Called when the [ItemTouchHelper] has completed the move or swipe, and the active item
* state should be cleared.
*/
fun onItemClear()
}

View file

@ -0,0 +1,12 @@
package info.nightscout.androidaps.plugins.general.automation.dragHelpers
import androidx.recyclerview.widget.RecyclerView
interface OnStartDragListener {
/**
* Called when a view is requesting a start of a drag.
*
* @param viewHolder The holder of the view to drag.
*/
fun onStartDrag(viewHolder: RecyclerView.ViewHolder)
}

View file

@ -0,0 +1,85 @@
package info.nightscout.androidaps.plugins.general.automation.dragHelpers
import android.graphics.Canvas
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import kotlin.math.abs
/**
* An implementation of [ItemTouchHelper.Callback] that enables basic drag & drop and
* swipe-to-dismiss. Drag events are automatically started by an item long-press.<br></br>
*
* Expects the `RecyclerView.Adapter` to listen for [ ] callbacks and the `RecyclerView.ViewHolder` to implement
* [ItemTouchHelperViewHolder].
*
*/
class SimpleItemTouchHelperCallback(private val mAdapter: ItemTouchHelperAdapter) : ItemTouchHelper.Callback() {
override fun isLongPressDragEnabled(): Boolean {
return true
}
override fun isItemViewSwipeEnabled(): Boolean {
return true
}
override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int { // Set movement flags based on the layout manager
return if (recyclerView.layoutManager is GridLayoutManager) {
val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
val swipeFlags = 0
makeMovementFlags(dragFlags, swipeFlags)
} else {
val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
val swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END
makeMovementFlags(dragFlags, swipeFlags)
}
}
override fun onMove(recyclerView: RecyclerView, source: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
if (source.itemViewType != target.itemViewType) {
return false
}
// Notify the adapter of the move
mAdapter.onItemMove(source.adapterPosition, target.adapterPosition)
return true
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, i: Int) { // Notify the adapter of the dismissal
mAdapter.onItemDismiss(viewHolder.adapterPosition)
}
override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) {
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { // Fade out the view as it is swiped out of the parent's bounds
val alpha = ALPHA_FULL - abs(dX) / viewHolder.itemView.width.toFloat()
viewHolder.itemView.alpha = alpha
viewHolder.itemView.translationX = dX
} else {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
}
}
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { // We only want the active item to change
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder is ItemTouchHelperViewHolder) { // Let the view holder know that this item is being moved or dragged
val itemViewHolder: ItemTouchHelperViewHolder = viewHolder
itemViewHolder.onItemSelected()
}
}
super.onSelectedChanged(viewHolder, actionState)
}
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
super.clearView(recyclerView, viewHolder)
viewHolder.itemView.alpha = ALPHA_FULL
if (viewHolder is ItemTouchHelperViewHolder) { // Tell the view holder it's time to restore the idle state
val itemViewHolder: ItemTouchHelperViewHolder = viewHolder
itemViewHolder.onItemClear()
}
}
companion object {
const val ALPHA_FULL = 1.0f
}
}

View file

@ -1,12 +1,12 @@
package info.nightscout.androidaps.plugins.general.automation.triggers; package info.nightscout.androidaps.plugins.general.automation.triggers;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.ContextWrapper; import android.content.ContextWrapper;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import com.google.common.base.Optional; import com.google.common.base.Optional;
@ -84,11 +84,11 @@ public abstract class Trigger {
} }
@Nullable @Nullable
Activity scanForActivity(Context cont) { AppCompatActivity scanForActivity(Context cont) {
if (cont == null) if (cont == null)
return null; return null;
else if (cont instanceof Activity) else if (cont instanceof AppCompatActivity)
return (Activity) cont; return (AppCompatActivity) cont;
else if (cont instanceof ContextWrapper) else if (cont instanceof ContextWrapper)
return scanForActivity(((ContextWrapper) cont).getBaseContext()); return scanForActivity(((ContextWrapper) cont).getBaseContext());

View file

@ -1,6 +1,5 @@
package info.nightscout.androidaps.plugins.general.automation.triggers; package info.nightscout.androidaps.plugins.general.automation.triggers;
import android.app.Activity;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.text.format.DateFormat; import android.text.format.DateFormat;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -9,6 +8,7 @@ import android.widget.TextView;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import com.dpro.widgets.WeekdaysPicker; import com.dpro.widgets.WeekdaysPicker;
@ -269,6 +269,8 @@ public class TriggerRecurringTime extends Trigger {
weekdaysPicker.setSelectedDays(getSelectedDays()); weekdaysPicker.setSelectedDays(getSelectedDays());
weekdaysPicker.setOnWeekdaysChangeListener((view, i, list) -> set(DayOfWeek.fromCalendarInt(i), list.contains(i))); weekdaysPicker.setOnWeekdaysChangeListener((view, i, list) -> set(DayOfWeek.fromCalendarInt(i), list.contains(i)));
weekdaysPicker.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); weekdaysPicker.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
weekdaysPicker.setSundayFirstDay(Calendar.getInstance().getFirstDayOfWeek() == Calendar.SUNDAY);
weekdaysPicker.redrawDays();
root.addView(weekdaysPicker); root.addView(weekdaysPicker);
@ -294,9 +296,9 @@ public class TriggerRecurringTime extends Trigger {
); );
tpd.setThemeDark(true); tpd.setThemeDark(true);
tpd.dismissOnPause(true); tpd.dismissOnPause(true);
Activity a = scanForActivity(root.getContext()); AppCompatActivity a = scanForActivity(root.getContext());
if (a != null) if (a != null)
tpd.show(a.getFragmentManager(), "TimePickerDialog"); tpd.show(a.getSupportFragmentManager(), "TimePickerDialog");
}); });
int px = MainApp.dpToPx(10); int px = MainApp.dpToPx(10);

View file

@ -1,12 +1,12 @@
package info.nightscout.androidaps.plugins.general.automation.triggers; package info.nightscout.androidaps.plugins.general.automation.triggers;
import android.app.Activity;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.text.format.DateFormat; import android.text.format.DateFormat;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import com.google.common.base.Optional; import com.google.common.base.Optional;
@ -142,9 +142,9 @@ public class TriggerTime extends Trigger {
); );
dpd.setThemeDark(true); dpd.setThemeDark(true);
dpd.dismissOnPause(true); dpd.dismissOnPause(true);
Activity a = scanForActivity(root.getContext()); AppCompatActivity a = scanForActivity(root.getContext());
if (a != null) if (a != null)
dpd.show(a.getFragmentManager(), "DatePickerDialog"); dpd.show(a.getSupportFragmentManager(), "DatePickerDialog");
}); });
timeButton.setOnClickListener(view -> { timeButton.setOnClickListener(view -> {
GregorianCalendar calendar = new GregorianCalendar(); GregorianCalendar calendar = new GregorianCalendar();
@ -162,9 +162,9 @@ public class TriggerTime extends Trigger {
); );
tpd.setThemeDark(true); tpd.setThemeDark(true);
tpd.dismissOnPause(true); tpd.dismissOnPause(true);
Activity a = scanForActivity(root.getContext()); AppCompatActivity a = scanForActivity(root.getContext());
if (a != null) if (a != null)
tpd.show(a.getFragmentManager(), "TimePickerDialog"); tpd.show(a.getSupportFragmentManager(), "TimePickerDialog");
}); });
int px = MainApp.dpToPx(10); int px = MainApp.dpToPx(10);

View file

@ -1,12 +1,12 @@
package info.nightscout.androidaps.plugins.general.automation.triggers; package info.nightscout.androidaps.plugins.general.automation.triggers;
import android.app.Activity;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.text.format.DateFormat; import android.text.format.DateFormat;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import com.google.common.base.Optional; import com.google.common.base.Optional;
@ -18,7 +18,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar; import java.util.GregorianCalendar;
import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.MainApp;
@ -60,11 +59,11 @@ public class TriggerTimeRange extends Trigger {
return false; return false;
boolean doRun = false; boolean doRun = false;
if ( start < end && start < currentMinSinceMidnight && currentMinSinceMidnight < end) if (start < end && start < currentMinSinceMidnight && currentMinSinceMidnight < end)
doRun = true; doRun = true;
// handle cases like 10PM to 6AM // handle cases like 10PM to 6AM
else if ( start > end && (start < currentMinSinceMidnight || currentMinSinceMidnight < end)) else if (start > end && (start < currentMinSinceMidnight || currentMinSinceMidnight < end))
doRun = true; doRun = true;
if (doRun) { if (doRun) {
@ -129,8 +128,8 @@ public class TriggerTimeRange extends Trigger {
} }
TriggerTimeRange period(int start, int end) { TriggerTimeRange period(int start, int end) {
this.start = getMinSinceMidnight(start*60000); this.start = getMinSinceMidnight(start * 60000);
this.end = getMinSinceMidnight(end*60000); this.end = getMinSinceMidnight(end * 60000);
return this; return this;
} }
@ -145,7 +144,7 @@ public class TriggerTimeRange extends Trigger {
} }
long toMilis(long minutesSinceMidnight) { long toMilis(long minutesSinceMidnight) {
return minutesSinceMidnight*60*1000; return minutesSinceMidnight * 60 * 1000;
} }
public int getMinSinceMidnight(long time) { public int getMinSinceMidnight(long time) {
@ -157,11 +156,11 @@ public class TriggerTimeRange extends Trigger {
return (calendar.get(Calendar.HOUR_OF_DAY) * 60) + calendar.get(Calendar.MINUTE); return (calendar.get(Calendar.HOUR_OF_DAY) * 60) + calendar.get(Calendar.MINUTE);
} }
int getStart(){ int getStart() {
return start; return start;
} }
int getEnd(){ int getEnd() {
return end; return end;
} }
@ -170,8 +169,8 @@ public class TriggerTimeRange extends Trigger {
TextView label = new TextView(root.getContext()); TextView label = new TextView(root.getContext());
TextView startButton = new TextView(root.getContext()); TextView startButton = new TextView(root.getContext());
TextView endButton = new TextView(root.getContext()); TextView endButton = new TextView(root.getContext());
log.debug("Start is: " + start ); log.debug("Start is: " + start);
log.debug("End is: " + end ); log.debug("End is: " + end);
startButton.setText(DateUtil.timeString(toMilis(start) - timeZoneOffset)); startButton.setText(DateUtil.timeString(toMilis(start) - timeZoneOffset));
endButton.setText(MainApp.gs(R.string.and) + " " + DateUtil.timeString(toMilis(end) - timeZoneOffset)); endButton.setText(MainApp.gs(R.string.and) + " " + DateUtil.timeString(toMilis(end) - timeZoneOffset));
@ -193,9 +192,9 @@ public class TriggerTimeRange extends Trigger {
); );
tpd.setThemeDark(true); tpd.setThemeDark(true);
tpd.dismissOnPause(true); tpd.dismissOnPause(true);
Activity a = scanForActivity(root.getContext()); AppCompatActivity a = scanForActivity(root.getContext());
if (a != null) if (a != null)
tpd.show(a.getFragmentManager(), "TimePickerDialog"); tpd.show(a.getSupportFragmentManager(), "TimePickerDialog");
}); });
endButton.setOnClickListener(view -> { endButton.setOnClickListener(view -> {
GregorianCalendar calendar = new GregorianCalendar(); GregorianCalendar calendar = new GregorianCalendar();
@ -213,9 +212,9 @@ public class TriggerTimeRange extends Trigger {
); );
tpd.setThemeDark(true); tpd.setThemeDark(true);
tpd.dismissOnPause(true); tpd.dismissOnPause(true);
Activity a = scanForActivity(root.getContext()); AppCompatActivity a = scanForActivity(root.getContext());
if (a != null) if (a != null)
tpd.show(a.getFragmentManager(), "TimePickerDialog"); tpd.show(a.getSupportFragmentManager(), "TimePickerDialog");
}); });
int px = MainApp.dpToPx(10); int px = MainApp.dpToPx(10);

View file

@ -1,10 +1,8 @@
package info.nightscout.androidaps.plugins.general.careportal.Dialogs; package info.nightscout.androidaps.plugins.general.careportal.Dialogs;
import android.app.Activity; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import androidx.fragment.app.DialogFragment;
import androidx.appcompat.app.AlertDialog;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.text.format.DateFormat; import android.text.format.DateFormat;
@ -20,9 +18,12 @@ import android.widget.RadioButton;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatDialogFragment;
import androidx.fragment.app.DialogFragment;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.wdullaer.materialdatetimepicker.date.DatePickerDialog; import com.wdullaer.materialdatetimepicker.date.DatePickerDialog;
import com.wdullaer.materialdatetimepicker.time.RadialPickerLayout;
import com.wdullaer.materialdatetimepicker.time.TimePickerDialog; import com.wdullaer.materialdatetimepicker.time.TimePickerDialog;
import org.json.JSONException; import org.json.JSONException;
@ -39,7 +40,6 @@ import java.util.List;
import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.ProfileStore; import info.nightscout.androidaps.data.ProfileStore;
import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.BgReading;
@ -51,6 +51,7 @@ import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions; import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.general.careportal.OptionsToShow; import info.nightscout.androidaps.plugins.general.careportal.OptionsToShow;
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload; import info.nightscout.androidaps.plugins.general.nsclient.NSUpload;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin; import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
import info.nightscout.androidaps.utils.DateUtil; import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.DefaultValueHelper; import info.nightscout.androidaps.utils.DefaultValueHelper;
@ -61,11 +62,9 @@ import info.nightscout.androidaps.utils.SP;
import info.nightscout.androidaps.utils.SafeParse; import info.nightscout.androidaps.utils.SafeParse;
import info.nightscout.androidaps.utils.Translator; import info.nightscout.androidaps.utils.Translator;
public class NewNSTreatmentDialog extends DialogFragment implements View.OnClickListener, DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener { public class NewNSTreatmentDialog extends AppCompatDialogFragment implements View.OnClickListener, DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener {
private static Logger log = LoggerFactory.getLogger(NewNSTreatmentDialog.class); private static Logger log = LoggerFactory.getLogger(NewNSTreatmentDialog.class);
private Activity context;
private static OptionsToShow options; private static OptionsToShow options;
private static String event; private static String event;
@ -119,18 +118,6 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
} }
} }
@Override
public void onAttach(Activity activity) {
context = activity;
super.onAttach(activity);
}
@Override
public void onDetach() {
super.onDetach();
this.context = null;
}
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
@ -421,18 +408,18 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
); );
dpd.setThemeDark(true); dpd.setThemeDark(true);
dpd.dismissOnPause(true); dpd.dismissOnPause(true);
dpd.show(context.getFragmentManager(), "Datepickerdialog"); dpd.show(getActivity().getSupportFragmentManager(), "Datepickerdialog");
break; break;
case R.id.careportal_newnstreatment_eventtime: case R.id.careportal_newnstreatment_eventtime:
TimePickerDialog tpd = TimePickerDialog.newInstance( TimePickerDialog tpd = TimePickerDialog.newInstance(
this, this,
calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE), calendar.get(Calendar.MINUTE),
DateFormat.is24HourFormat(context) DateFormat.is24HourFormat(getContext())
); );
tpd.setThemeDark(true); tpd.setThemeDark(true);
tpd.dismissOnPause(true); tpd.dismissOnPause(true);
tpd.show(context.getFragmentManager(), "Timepickerdialog"); tpd.show(getActivity().getSupportFragmentManager(), "Timepickerdialog");
break; break;
case R.id.ok: case R.id.ok:
confirmNSTreatmentCreation(); confirmNSTreatmentCreation();
@ -469,7 +456,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
} }
@Override @Override
public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute, int second) { public void onTimeSet(TimePickerDialog view, int hourOfDay, int minute, int second) {
eventTime.setHours(hourOfDay); eventTime.setHours(hourOfDay);
eventTime.setMinutes(minute); eventTime.setMinutes(minute);
eventTime.setSeconds(this.seconds++); // randomize seconds to prevent creating record of the same time, if user choose time manually eventTime.setSeconds(this.seconds++); // randomize seconds to prevent creating record of the same time, if user choose time manually
@ -477,7 +464,6 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
updateBGforDateTime(); updateBGforDateTime();
} }
JSONObject gatherData() { JSONObject gatherData() {
String enteredBy = SP.getString("careportal_enteredby", ""); String enteredBy = SP.getString("careportal_enteredby", "");
JSONObject data = new JSONObject(); JSONObject data = new JSONObject();
@ -702,6 +688,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
} }
void confirmNSTreatmentCreation() { void confirmNSTreatmentCreation() {
Context context = getContext();
if (context != null) { if (context != null) {
final JSONObject data = gatherData(); final JSONObject data = gatherData();
final String confirmText = buildConfirmText(data); final String confirmText = buildConfirmText(data);
@ -715,7 +702,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
} }
public void createNSTreatment(JSONObject data) { void createNSTreatment(JSONObject data) {
if (options.executeProfileSwitch) { if (options.executeProfileSwitch) {
if (data.has("profile")) { if (data.has("profile")) {
ProfileFunctions.doProfileSwitch(profileStore, JsonHelper.safeGetString(data, "profile"), JsonHelper.safeGetInt(data, "duration"), JsonHelper.safeGetInt(data, "percentage"), JsonHelper.safeGetInt(data, "timeshift")); ProfileFunctions.doProfileSwitch(profileStore, JsonHelper.safeGetString(data, "profile"), JsonHelper.safeGetInt(data, "duration"), JsonHelper.safeGetInt(data, "percentage"), JsonHelper.safeGetInt(data, "timeshift"));

View file

@ -30,6 +30,7 @@ import info.nightscout.androidaps.events.EventAppExit;
import info.nightscout.androidaps.logging.L; import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.bus.RxBus; import info.nightscout.androidaps.plugins.bus.RxBus;
import info.nightscout.androidaps.utils.OKDialog; import info.nightscout.androidaps.utils.OKDialog;
import info.nightscout.androidaps.utils.SP;
import info.nightscout.androidaps.utils.ToastUtils; import info.nightscout.androidaps.utils.ToastUtils;
/** /**
@ -113,27 +114,24 @@ public class ImportExportPrefs {
.setMessage(MainApp.gs(R.string.import_from) + " " + file + " ?") .setMessage(MainApp.gs(R.string.import_from) + " " + file + " ?")
.setPositiveButton(android.R.string.yes, (dialog, which) -> { .setPositiveButton(android.R.string.yes, (dialog, which) -> {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = prefs.edit();
String line; String line;
String[] lineParts; String[] lineParts;
try { try {
editor.clear(); SP.clear();
editor.commit();
BufferedReader reader = new BufferedReader(new FileReader(file)); BufferedReader reader = new BufferedReader(new FileReader(file));
while ((line = reader.readLine()) != null) { while ((line = reader.readLine()) != null) {
lineParts = line.split("::"); lineParts = line.split("::");
if (lineParts.length == 2) { if (lineParts.length == 2) {
if (lineParts[1].equals("true") || lineParts[1].equals("false")) { if (lineParts[1].equals("true") || lineParts[1].equals("false")) {
editor.putBoolean(lineParts[0], Boolean.parseBoolean(lineParts[1])); SP.putBoolean(lineParts[0], Boolean.parseBoolean(lineParts[1]));
} else { } else {
editor.putString(lineParts[0], lineParts[1]); SP.putString(lineParts[0], lineParts[1]);
} }
} }
} }
reader.close(); reader.close();
editor.commit(); SP.putBoolean(R.string.key_setupwizard_processed, true);
OKDialog.show(context, MainApp.gs(R.string.setting_imported), MainApp.gs(R.string.restartingapp), () -> { OKDialog.show(context, MainApp.gs(R.string.setting_imported), MainApp.gs(R.string.restartingapp), () -> {
log.debug("Exiting"); log.debug("Exiting");
MainApp.instance().stopKeepAliveService(); MainApp.instance().stopKeepAliveService();

View file

@ -6,11 +6,11 @@ import android.widget.CheckBox
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import info.nightscout.androidaps.R import info.nightscout.androidaps.R
import info.nightscout.androidaps.activities.NoSplashActivity import info.nightscout.androidaps.activities.NoSplashAppCompatActivity
import info.nightscout.androidaps.logging.L import info.nightscout.androidaps.logging.L
import kotlinx.android.synthetic.main.activity_logsetting.* import kotlinx.android.synthetic.main.activity_logsetting.*
class LogSettingActivity : NoSplashActivity() { class LogSettingActivity : NoSplashAppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)

View file

@ -19,7 +19,7 @@ class InfoInterceptor(tag: String) : Interceptor {
@Throws(IOException::class) @Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response { override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request() val request = chain.request()
request?.body()?.let { request.body?.let {
if (L.isEnabled(L.TIDEPOOL)) { if (L.isEnabled(L.TIDEPOOL)) {
log.debug("Interceptor Body size: " + it.contentLength()) log.debug("Interceptor Body size: " + it.contentLength())
val requestBuffer = Buffer() val requestBuffer = Buffer()

View file

@ -14,9 +14,9 @@ import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.OKDialog import info.nightscout.androidaps.utils.OKDialog
import info.nightscout.androidaps.utils.SP import info.nightscout.androidaps.utils.SP
import info.nightscout.androidaps.utils.T import info.nightscout.androidaps.utils.T
import okhttp3.MediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.logging.HttpLoggingInterceptor import okhttp3.logging.HttpLoggingInterceptor
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import retrofit2.Retrofit import retrofit2.Retrofit
@ -43,7 +43,7 @@ object TidepoolUploader {
val PUMPTYPE = "Tandem" val PUMPTYPE = "Tandem"
var connectionStatus: ConnectionStatus = TidepoolUploader.ConnectionStatus.DISCONNECTED var connectionStatus: ConnectionStatus = ConnectionStatus.DISCONNECTED
fun getRetrofitInstance(): Retrofit? { fun getRetrofitInstance(): Retrofit? {
if (retrofit == null) { if (retrofit == null) {
@ -75,7 +75,7 @@ object TidepoolUploader {
retrofit = null retrofit = null
if (L.isEnabled(L.TIDEPOOL)) if (L.isEnabled(L.TIDEPOOL))
log.debug("Instance reset") log.debug("Instance reset")
connectionStatus = TidepoolUploader.ConnectionStatus.DISCONNECTED connectionStatus = ConnectionStatus.DISCONNECTED
} }
@Synchronized @Synchronized
@ -197,7 +197,7 @@ object TidepoolUploader {
} }
else -> { else -> {
val body = RequestBody.create(MediaType.parse("application/json"), chunk) val body = chunk.toRequestBody("application/json".toMediaTypeOrNull())
RxBus.send(EventTidepoolStatus(("Uploading"))) RxBus.send(EventTidepoolStatus(("Uploading")))
if (session.service != null && session.token != null && session.datasetReply != null) { if (session.service != null && session.token != null && session.datasetReply != null) {
@ -231,11 +231,11 @@ object TidepoolUploader {
extendWakeLock(60000) extendWakeLock(60000)
val call = session!!.service?.deleteDataSet(session!!.token!!, session!!.datasetReply!!.id!!) val call = session!!.service?.deleteDataSet(session!!.token!!, session!!.datasetReply!!.id!!)
call?.enqueue(TidepoolCallback(session!!, "Delete Dataset", { call?.enqueue(TidepoolCallback(session!!, "Delete Dataset", {
connectionStatus = TidepoolUploader.ConnectionStatus.DISCONNECTED connectionStatus = ConnectionStatus.DISCONNECTED
RxBus.send(EventTidepoolStatus(("Dataset removed OK"))) RxBus.send(EventTidepoolStatus(("Dataset removed OK")))
releaseWakeLock() releaseWakeLock()
}, { }, {
connectionStatus = TidepoolUploader.ConnectionStatus.DISCONNECTED connectionStatus = ConnectionStatus.DISCONNECTED
RxBus.send(EventTidepoolStatus(("Dataset remove FAILED"))) RxBus.send(EventTidepoolStatus(("Dataset remove FAILED")))
releaseWakeLock() releaseWakeLock()
})) }))
@ -255,11 +255,11 @@ object TidepoolUploader {
extendWakeLock(60000) extendWakeLock(60000)
val call = session.service?.deleteAllData(token, userid) val call = session.service?.deleteAllData(token, userid)
call?.enqueue(TidepoolCallback(session, "Delete all data", { call?.enqueue(TidepoolCallback(session, "Delete all data", {
connectionStatus = TidepoolUploader.ConnectionStatus.DISCONNECTED connectionStatus = ConnectionStatus.DISCONNECTED
RxBus.send(EventTidepoolStatus(("All data removed OK"))) RxBus.send(EventTidepoolStatus(("All data removed OK")))
releaseWakeLock() releaseWakeLock()
}, { }, {
connectionStatus = TidepoolUploader.ConnectionStatus.DISCONNECTED connectionStatus = ConnectionStatus.DISCONNECTED
RxBus.send(EventTidepoolStatus(("All data remove FAILED"))) RxBus.send(EventTidepoolStatus(("All data remove FAILED")))
releaseWakeLock() releaseWakeLock()
})) }))

View file

@ -3,9 +3,9 @@ package info.nightscout.androidaps.plugins.general.tidepool.events
import info.nightscout.androidaps.events.Event import info.nightscout.androidaps.events.Event
import info.nightscout.androidaps.logging.L import info.nightscout.androidaps.logging.L
import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.LocaleHelper
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.*
class EventTidepoolStatus(val status: String) : Event() { class EventTidepoolStatus(val status: String) : Event() {
private val log = LoggerFactory.getLogger(L.TIDEPOOL) private val log = LoggerFactory.getLogger(L.TIDEPOOL)
@ -17,7 +17,7 @@ class EventTidepoolStatus(val status: String) : Event() {
log.debug("New status: $status") log.debug("New status: $status")
} }
private var timeFormat = SimpleDateFormat("HH:mm:ss", LocaleHelper.currentLocale()) private var timeFormat = SimpleDateFormat("HH:mm:ss", Locale.getDefault())
fun toPreparedHtml(): StringBuilder { fun toPreparedHtml(): StringBuilder {
val stringBuilder = StringBuilder() val stringBuilder = StringBuilder()

View file

@ -1,8 +1,9 @@
package info.nightscout.androidaps.plugins.general.tidepool.messages package info.nightscout.androidaps.plugins.general.tidepool.messages
import info.nightscout.androidaps.plugins.general.tidepool.utils.GsonInstance import info.nightscout.androidaps.plugins.general.tidepool.utils.GsonInstance
import okhttp3.MediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
open class BaseMessage { open class BaseMessage {
private fun toS(): String { private fun toS(): String {
@ -10,7 +11,7 @@ open class BaseMessage {
} }
fun getBody(): RequestBody { fun getBody(): RequestBody {
return RequestBody.create(MediaType.parse("application/json"), this.toS()) return this.toS().toRequestBody("application/json".toMediaTypeOrNull())
} }
} }

View file

@ -24,7 +24,7 @@ import java.util.List;
import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.activities.NoSplashActivity; import info.nightscout.androidaps.activities.NoSplashAppCompatActivity;
import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.DanaRHistoryRecord; import info.nightscout.androidaps.db.DanaRHistoryRecord;
import info.nightscout.androidaps.events.EventPumpStatusChanged; import info.nightscout.androidaps.events.EventPumpStatusChanged;
@ -44,7 +44,7 @@ import info.nightscout.androidaps.utils.FabricPrivacy;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.CompositeDisposable;
public class DanaRHistoryActivity extends NoSplashActivity { public class DanaRHistoryActivity extends NoSplashAppCompatActivity {
private static Logger log = LoggerFactory.getLogger(L.PUMP); private static Logger log = LoggerFactory.getLogger(L.PUMP);
private CompositeDisposable disposable = new CompositeDisposable(); private CompositeDisposable disposable = new CompositeDisposable();

View file

@ -12,9 +12,8 @@ import org.slf4j.LoggerFactory;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.activities.NoSplashActivity; import info.nightscout.androidaps.activities.NoSplashAppCompatActivity;
import info.nightscout.androidaps.events.EventInitializationChanged; import info.nightscout.androidaps.events.EventInitializationChanged;
import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.L; import info.nightscout.androidaps.logging.L;
@ -33,7 +32,7 @@ import io.reactivex.disposables.CompositeDisposable;
* Created by Rumen Georgiev on 5/31/2018. * Created by Rumen Georgiev on 5/31/2018.
*/ */
public class DanaRUserOptionsActivity extends NoSplashActivity { public class DanaRUserOptionsActivity extends NoSplashAppCompatActivity {
private static Logger log = LoggerFactory.getLogger(L.PUMP); private static Logger log = LoggerFactory.getLogger(L.PUMP);
private CompositeDisposable disposable = new CompositeDisposable(); private CompositeDisposable disposable = new CompositeDisposable();

View file

@ -20,13 +20,13 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.activities.NoSplashActivity; import info.nightscout.androidaps.activities.NoSplashAppCompatActivity;
import info.nightscout.androidaps.logging.L; import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin; import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntry; import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntry;
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntryGroup; import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntryGroup;
public class MedtronicHistoryActivity extends NoSplashActivity { public class MedtronicHistoryActivity extends NoSplashAppCompatActivity {
private static Logger LOG = LoggerFactory.getLogger(L.PUMP); private static Logger LOG = LoggerFactory.getLogger(L.PUMP);

View file

@ -48,7 +48,7 @@ class TreatmentsProfileSwitchFragment : Fragment() {
val builder = AlertDialog.Builder(this.context!!) val builder = AlertDialog.Builder(this.context!!)
builder.setTitle(MainApp.gs(R.string.confirmation)) builder.setTitle(MainApp.gs(R.string.confirmation))
builder.setMessage(MainApp.gs(R.string.refresheventsfromnightscout) + "?") builder.setMessage(MainApp.gs(R.string.refresheventsfromnightscout) + "?")
builder.setPositiveButton(MainApp.gs(R.string.ok)) { dialog: DialogInterface?, id: Int -> builder.setPositiveButton(MainApp.gs(R.string.ok)) { _ , _->
MainApp.getDbHelper().resetProfileSwitch() MainApp.getDbHelper().resetProfileSwitch()
RxBus.send(EventNSClientRestart()) RxBus.send(EventNSClientRestart())
} }

View file

@ -72,18 +72,6 @@ public class SetupWizardActivity extends NoSplashAppCompatActivity {
} }
} }
@Override
public void onBackPressed() {
if (currentWizardPage == 0)
OKDialog.showConfirmation(this, MainApp.gs(R.string.exitwizard), this::finish);
else showPreviousPage(null);
}
public void exitPressed(View view) {
SP.putBoolean(R.string.key_setupwizard_processed, true);
OKDialog.showConfirmation(this, MainApp.gs(R.string.exitwizard), this::finish);
}
@Override @Override
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
@ -157,6 +145,18 @@ public class SetupWizardActivity extends NoSplashAppCompatActivity {
}); });
} }
@Override
public void onBackPressed() {
if (currentWizardPage == 0)
OKDialog.showConfirmation(this, MainApp.gs(R.string.exitwizard), this::finish);
else showPreviousPage(null);
}
public void exitPressed(View view) {
SP.putBoolean(R.string.key_setupwizard_processed, true);
OKDialog.showConfirmation(this, MainApp.gs(R.string.exitwizard), this::finish);
}
public void showNextPage(View view) { public void showNextPage(View view) {
this.finish(); this.finish();
Intent intent = new Intent(this, SetupWizardActivity.class); Intent intent = new Intent(this, SetupWizardActivity.class);

View file

@ -3,6 +3,8 @@ package info.nightscout.androidaps.setupwizard.elements;
import android.view.View; import android.view.View;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import androidx.annotation.StringRes;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -67,12 +69,12 @@ public class SWItem {
return type; return type;
} }
public SWItem label(int label) { public SWItem label(@StringRes int label) {
this.label = label; this.label = label;
return this; return this;
} }
public SWItem comment(int comment) { public SWItem comment(@StringRes int comment) {
this.comment = comment; this.comment = comment;
return this; return this;
} }

View file

@ -1,21 +1,19 @@
package info.nightscout.androidaps.utils package info.nightscout.androidaps.utils
import android.content.Context import android.content.Context
import android.content.ContextWrapper
import android.os.Build
import android.os.LocaleList
import info.nightscout.androidaps.R import info.nightscout.androidaps.R
import java.util.* import java.util.*
object LocaleHelper {
fun update(context: Context) =
updateResources(context, currentLanguage())
object LocaleHelper {
fun currentLanguage(): String = fun currentLanguage(): String =
SP.getString(R.string.key_language, Locale.getDefault().language) SP.getString(R.string.key_language, Locale.getDefault().language)
fun currentLocale(): Locale = private fun currentLocale(): Locale {
Locale(SP.getString(R.string.key_language, Locale.getDefault().language)) val language = currentLanguage()
@Suppress("DEPRECATION")
private fun updateResources(context: Context, language: String) {
var locale = Locale(language) var locale = Locale(language)
if (language.contains("_")) { if (language.contains("_")) {
// language with country like pt_BR defined in arrays.xml // language with country like pt_BR defined in arrays.xml
@ -23,10 +21,35 @@ object LocaleHelper {
val country = language.substring(3, 5) val country = language.substring(3, 5)
locale = Locale(lang, country) locale = Locale(lang, country)
} }
return locale
}
@Suppress("DEPRECATION")
fun update(context: Context) {
val locale = currentLocale()
Locale.setDefault(locale) Locale.setDefault(locale)
val resources = context.resources val resources = context.resources
resources.configuration.setLocale(locale) val configuration = resources.configuration
resources.updateConfiguration(resources.configuration, resources.displayMetrics) context.createConfigurationContext(configuration)
configuration.setLocale(locale)
configuration.locale = locale
resources.updateConfiguration(configuration, resources.displayMetrics)
}
fun wrap(ctx: Context): ContextWrapper {
val res = ctx.resources
val configuration = res.configuration
val newLocale = currentLocale()
val context = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
configuration.setLocale(newLocale)
val localeList = LocaleList(newLocale)
LocaleList.setDefault(localeList)
configuration.locales = localeList
ctx.createConfigurationContext(configuration)
} else {
configuration.setLocale(newLocale)
ctx.createConfigurationContext(configuration)
}
return ContextWrapper(context)
} }
} }

View file

@ -10,7 +10,11 @@ import info.nightscout.androidaps.MainApp;
*/ */
public class SP { public class SP {
static SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext()); private static SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
static public void clear() {
sharedPreferences.edit().clear().apply();
}
static public boolean contains(String key) { static public boolean contains(String key) {
return sharedPreferences.contains(key); return sharedPreferences.contains(key);
@ -85,75 +89,51 @@ public class SP {
} }
static public void putBoolean(String key, boolean value) { static public void putBoolean(String key, boolean value) {
SharedPreferences.Editor editor = sharedPreferences.edit(); sharedPreferences.edit().putBoolean(key, value).apply();
editor.putBoolean(key, value);
editor.apply();
} }
static public void putBoolean(int resourceID, boolean value) { static public void putBoolean(int resourceID, boolean value) {
SharedPreferences.Editor editor = sharedPreferences.edit(); sharedPreferences.edit().putBoolean(MainApp.gs(resourceID), value).apply();
editor.putBoolean(MainApp.gs(resourceID), value);
editor.apply();
} }
static public void putDouble(String key, double value) { static public void putDouble(String key, double value) {
SharedPreferences.Editor editor = sharedPreferences.edit(); sharedPreferences.edit().putString(key, Double.toString(value)).apply();
editor.putString(key, Double.toString(value));
editor.apply();
} }
static public void putLong(String key, long value) { static public void putLong(String key, long value) {
SharedPreferences.Editor editor = sharedPreferences.edit(); sharedPreferences.edit().putLong(key, value).apply();
editor.putLong(key, value);
editor.apply();
} }
static public void putLong(int resourceID, long value) { static public void putLong(int resourceID, long value) {
SharedPreferences.Editor editor = sharedPreferences.edit(); sharedPreferences.edit().putLong(MainApp.gs(resourceID), value).apply();
editor.putLong(MainApp.gs(resourceID), value);
editor.apply();
} }
static public void putInt(String key, int value) { static public void putInt(String key, int value) {
SharedPreferences.Editor editor = sharedPreferences.edit(); sharedPreferences.edit().putInt(key, value).apply();
editor.putInt(key, value);
editor.apply();
} }
static public void putInt(int resourceID, int value) { static public void putInt(int resourceID, int value) {
SharedPreferences.Editor editor = sharedPreferences.edit(); sharedPreferences.edit().putInt(MainApp.gs(resourceID), value).apply();
editor.putInt(MainApp.gs(resourceID), value);
editor.apply();
} }
static public void incInt(int resourceID) { static public void incInt(int resourceID) {
SharedPreferences.Editor editor = sharedPreferences.edit();
int value = SP.getInt(resourceID, 0) + 1; int value = SP.getInt(resourceID, 0) + 1;
editor.putInt(MainApp.gs(resourceID), value); sharedPreferences.edit().putInt(MainApp.gs(resourceID), value).apply();
editor.apply();
} }
static public void putString(int resourceID, String value) { static public void putString(int resourceID, String value) {
SharedPreferences.Editor editor = sharedPreferences.edit(); sharedPreferences.edit().putString(MainApp.gs(resourceID), value).apply();
editor.putString(MainApp.gs(resourceID), value);
editor.apply();
} }
static public void putString(String key, String value) { static public void putString(String key, String value) {
SharedPreferences.Editor editor = sharedPreferences.edit(); sharedPreferences.edit().putString(key, value).apply();
editor.putString(key, value);
editor.apply();
} }
static public void remove(int resourceID) { static public void remove(int resourceID) {
SharedPreferences.Editor editor = sharedPreferences.edit(); sharedPreferences.edit().remove(MainApp.gs(resourceID)).apply();
editor.remove(MainApp.gs(resourceID));
editor.apply();
} }
static public void remove(String key) { static public void remove(String key) {
SharedPreferences.Editor editor = sharedPreferences.edit(); sharedPreferences.edit().remove(key).apply();
editor.remove(key);
editor.apply();
} }
} }

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#C0C0C0"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M3,15h18v-2L3,13v2zM3,19h18v-2L3,17v2zM3,11h18L21,9L3,9v2zM3,5v2h18L21,5L3,5z"/>
</vector>

View file

@ -142,7 +142,7 @@
</LinearLayout> </LinearLayout>
<include layout="@layout/mdtp_done_button" /> <include layout="@layout/okcancel" />
</LinearLayout> </LinearLayout>

View file

@ -1,65 +0,0 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="info.nightscout.androidaps.activities.AgreementActivity">
<ScrollView
android:layout_width="wrap_content"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:text="@string/end_user_license_agreement"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:textStyle="bold" />
<TextView
android:text="@string/app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:textSize="11sp" />
<TextView
android:text="@string/end_user_license_agreement_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:textSize="11sp" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/end_user_license_agreement_i_understand"
android:id="@+id/agreementCheckBox"
android:checked="false" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/save"
android:id="@+id/agreementSaveButton"
android:layout_marginTop="20dp" />
</LinearLayout>
</LinearLayout>
</ScrollView>
</RelativeLayout>

View file

@ -29,6 +29,7 @@
android:layout_marginStart="10dp" android:layout_marginStart="10dp"
android:layout_weight="1" android:layout_weight="1"
android:text="@string/exit" android:text="@string/exit"
android:onClick="exitPressed"
android:textAppearance="@android:style/TextAppearance.Material.Medium" android:textAppearance="@android:style/TextAppearance.Material.Medium"
android:textStyle="bold" /> android:textStyle="bold" />
</LinearLayout> </LinearLayout>

View file

@ -8,6 +8,8 @@
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:clickable="true"
android:focusable="true"
android:background="@color/ribbonDefault" android:background="@color/ribbonDefault"
android:padding="8dp"> android:padding="8dp">
@ -26,21 +28,21 @@
android:layout_alignBottom="@+id/automation_enabled" android:layout_alignBottom="@+id/automation_enabled"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginTop="6dp" android:layout_marginTop="6dp"
android:layout_toStartOf="@+id/iconTrash" android:layout_toStartOf="@+id/iconSort"
android:layout_toEndOf="@id/automation_enabled" android:layout_toEndOf="@id/automation_enabled"
android:text="Title" android:text="Title"
android:textAlignment="viewStart" android:textAlignment="viewStart"
android:textStyle="bold" /> android:textStyle="bold" />
<ImageView <ImageView
android:id="@+id/iconTrash" android:id="@+id/iconSort"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:contentDescription="@string/remove_label" android:contentDescription="@string/reorder_label"
android:orientation="horizontal" android:orientation="horizontal"
android:src="@drawable/ic_trash_outline" /> android:src="@drawable/ic_reorder_gray_24dp" />
<LinearLayout <LinearLayout
android:id="@+id/iconLayout" android:id="@+id/iconLayout"

View file

@ -567,7 +567,7 @@
</LinearLayout> </LinearLayout>
<include layout="@layout/mdtp_done_button" /> <include layout="@layout/okcancel" />
</LinearLayout> </LinearLayout>

View file

@ -47,7 +47,7 @@
android:layout_marginRight="30dp" /> android:layout_marginRight="30dp" />
<include layout="@layout/mdtp_done_button" /> <include layout="@layout/okcancel" />
</LinearLayout> </LinearLayout>

View file

@ -150,7 +150,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:entries="@array/quickWizardYesNo"/> android:entries="@array/quickWizardYesNo"/>
<include layout="@layout/mdtp_done_button" /> <include layout="@layout/okcancel" />
</LinearLayout> </LinearLayout>

View file

@ -214,7 +214,7 @@
</LinearLayout> </LinearLayout>
<include layout="@layout/mdtp_done_button" /> <include layout="@layout/okcancel" />
</LinearLayout> </LinearLayout>

View file

@ -82,6 +82,6 @@
</LinearLayout> </LinearLayout>
<include layout="@layout/mdtp_done_button" /> <include layout="@layout/okcancel" />
</LinearLayout> </LinearLayout>

View file

@ -179,7 +179,7 @@
</LinearLayout> </LinearLayout>
<include layout="@layout/mdtp_done_button" /> <include layout="@layout/okcancel" />
</LinearLayout> </LinearLayout>

View file

@ -139,7 +139,7 @@
android:layout_marginLeft="30dp" android:layout_marginLeft="30dp"
android:layout_marginRight="30dp" /> android:layout_marginRight="30dp" />
<include layout="@layout/mdtp_done_button" /> <include layout="@layout/okcancel" />
</LinearLayout> </LinearLayout>

View file

@ -65,7 +65,7 @@
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginBottom="15dp" /> android:layout_marginBottom="15dp" />
<include layout="@layout/mdtp_done_button" /> <include layout="@layout/okcancel" />
</LinearLayout> </LinearLayout>

View file

@ -10,8 +10,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<com.google.android.flexbox.FlexboxLayout xmlns:android="http://schemas.android.com/apk/res/android" <com.google.android.flexbox.FlexboxLayout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/defaultbackground" android:background="@color/defaultbackground"
@ -19,7 +18,7 @@
app:alignItems="stretch" app:alignItems="stretch"
app:flexDirection="row" app:flexDirection="row"
app:flexWrap="wrap" app:flexWrap="wrap"
app:justifyContent="space_between"> app:justifyContent="center">
<TextView <TextView
android:id="@+id/treatments_treatments" android:id="@+id/treatments_treatments"

View file

@ -358,10 +358,8 @@
<string name="button1">Knoppie 1</string> <string name="button1">Knoppie 1</string>
<string name="button2">Knoppie 2</string> <string name="button2">Knoppie 2</string>
<string name="button3">Knoppie 3</string> <string name="button3">Knoppie 3</string>
<string name="units">Eenhede:</string>
<string name="mgdl">mg/dl</string> <string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string> <string name="mmol">mmol/l</string>
<string name="dia">DIA:</string>
<string name="target_range">Doelwit reeks:</string> <string name="target_range">Doelwit reeks:</string>
<string name="prefs_range_title">Reeks vir visualisering</string> <string name="prefs_range_title">Reeks vir visualisering</string>
<string name="prefs_range_summary">Hoë en lae merke vir die diagramme in Overview en Smartwatch</string> <string name="prefs_range_summary">Hoë en lae merke vir die diagramme in Overview en Smartwatch</string>

View file

@ -376,10 +376,11 @@
<string name="button1">Бутон 1</string> <string name="button1">Бутон 1</string>
<string name="button2">Бутон 2</string> <string name="button2">Бутон 2</string>
<string name="button3">Бутон 3</string> <string name="button3">Бутон 3</string>
<string name="units">Единици:</string> <string name="units_colon">Единици:</string>
<string name="units">Единици</string>
<string name="mgdl">мг/дл</string> <string name="mgdl">мг/дл</string>
<string name="mmol">ммол/л</string> <string name="mmol">ммол/л</string>
<string name="dia">DIA:</string> <string name="dia">DIA</string>
<string name="target_range">Целева КЗ:</string> <string name="target_range">Целева КЗ:</string>
<string name="prefs_range_title">Диапазон за визуализация</string> <string name="prefs_range_title">Диапазон за визуализация</string>
<string name="prefs_range_summary">Стойност на линиите за ниска и висока КЗ (mmol/l) за телефона и часовника</string> <string name="prefs_range_summary">Стойност на линиите за ниска и висока КЗ (mmol/l) за телефона и часовника</string>
@ -1391,7 +1392,29 @@
<string name="format_percent">%1$d %%</string> <string name="format_percent">%1$d %%</string>
<string name="boluswizard">Болус калкулатор</string> <string name="boluswizard">Болус калкулатор</string>
<string name="unit_minute_short">мин</string> <string name="unit_minute_short">мин</string>
<string name="profile_name">Име на профила:</string>
<string name="selected_profile">Избрано:</string>
<string name="unitsnosemicolon">Единици</string>
<string name="doyouwantswitchprofile">Искате да смените профила и премахнете на промените, направени в текущия профил?</string>
<string name="format_carbs">%1$dг</string> <string name="format_carbs">%1$dг</string>
<string name="common_on">Вкл</string> <string name="common_on">Вкл</string>
<string name="common_off">Изкл</string> <string name="common_off">Изкл</string>
<string name="objectives_button_unfinish">Изчисти приключение</string>
<string name="objectives_button_unstart">Изчисти стартираните</string>
<string name="timedetection">Засичане на времето</string>
<string name="doyouwantresetstart">Искате ли да нулирате прогреса си?</string>
<string name="nopumpselected">Не е избрана помпа</string>
<string name="setupwizard_units_prompt">Изберете единиците, в които искате да работите</string>
<string name="ns_ploadlocalprofile">Качване на локални промени в НС профила</string>
<string name="dia_short">DIA</string>
<string name="ic_short">IC (Инсулин/въглехидр.):</string>
<string name="isf_short">ISF (Инс.чувствителност)</string>
<string name="target_short">Цел</string>
<string name="clone_label">Клонирай</string>
<string name="saveorresetchangesfirst">Първо запазете или се откажете от промените</string>
<string name="deletecurrentprofile">Изтриване на текущия профил?</string>
<string name="copytolocalprofile">Създаване на нов локален профил от това превключване?</string>
<string name="profilenamecontainsdot">Името на профила съдържа точка.\nТова не се поддържа от НС.\nПрофилът не е качен в НС.</string>
<string name="low_mark_comment">Ниската граница на диапазона (графика)</string>
<string name="high_mark_comment">Високата граница на диапазона (графика)</string>
</resources> </resources>

View file

@ -376,10 +376,11 @@
<string name="button1">Tlačítko 1</string> <string name="button1">Tlačítko 1</string>
<string name="button2">Tlačítko 2</string> <string name="button2">Tlačítko 2</string>
<string name="button3">Tlačítko 3</string> <string name="button3">Tlačítko 3</string>
<string name="units">Jednotky:</string> <string name="units_colon">Jednotky:</string>
<string name="units">Jednotky</string>
<string name="mgdl">mg/dL</string> <string name="mgdl">mg/dL</string>
<string name="mmol">mmol/L</string> <string name="mmol">mmol/L</string>
<string name="dia">DIA:</string> <string name="dia">DIA</string>
<string name="target_range">Cílový rozsah:</string> <string name="target_range">Cílový rozsah:</string>
<string name="prefs_range_title">Rozsah pro zobrazení</string> <string name="prefs_range_title">Rozsah pro zobrazení</string>
<string name="prefs_range_summary">Značka vysoké a nízké hodnoty v přehledu a na hodinkách Wear</string> <string name="prefs_range_summary">Značka vysoké a nízké hodnoty v přehledu a na hodinkách Wear</string>
@ -1391,6 +1392,10 @@
<string name="format_percent">%1$d%%</string> <string name="format_percent">%1$d%%</string>
<string name="boluswizard">Bolusová kalkulačka</string> <string name="boluswizard">Bolusová kalkulačka</string>
<string name="unit_minute_short">min</string> <string name="unit_minute_short">min</string>
<string name="profile_name">Jméno profilu:</string>
<string name="selected_profile">Vybráno:</string>
<string name="unitsnosemicolon">Jednotky</string>
<string name="doyouwantswitchprofile">Chcete přepnout profil a zahodit změny provedené v aktuálním profilu?</string>
<string name="format_carbs">%1$dg</string> <string name="format_carbs">%1$dg</string>
<string name="common_on">ZAP</string> <string name="common_on">ZAP</string>
<string name="common_off">VYP</string> <string name="common_off">VYP</string>
@ -1398,4 +1403,18 @@
<string name="objectives_button_unstart">Vymazat start</string> <string name="objectives_button_unstart">Vymazat start</string>
<string name="timedetection">Detekce času</string> <string name="timedetection">Detekce času</string>
<string name="doyouwantresetstart">Chcete resetovat začátek cíle? Můžete přijít o svůj pokrok.</string> <string name="doyouwantresetstart">Chcete resetovat začátek cíle? Můžete přijít o svůj pokrok.</string>
<string name="nopumpselected">Nevybrána žádná pumpa</string>
<string name="setupwizard_units_prompt">Vyberte jednotky, ve kterých chcete zobrazit hodnoty</string>
<string name="ns_ploadlocalprofile">Odeslat změny lokálního profilu do NS</string>
<string name="dia_short">DIA</string>
<string name="ic_short">I:C</string>
<string name="isf_short">ISF</string>
<string name="target_short">CÍL</string>
<string name="clone_label">Klonovat</string>
<string name="saveorresetchangesfirst">Nejprve uložte nebo resetujte aktuální změny</string>
<string name="deletecurrentprofile">Odstranit aktuální profil?</string>
<string name="copytolocalprofile">Chcete vytvořit nový lokální profil z tohoto přepnutí profilu?</string>
<string name="profilenamecontainsdot">Název profilu obsahuje tečky.\nToto není v NS podporováno.\nProfil není přenesen do NS.</string>
<string name="low_mark_comment">Spodní hodnota oblasti v rozsahu (pouze zobrazování)</string>
<string name="high_mark_comment">Horní hodnota oblasti v rozsahu (pouze zobrazování)</string>
</resources> </resources>

View file

@ -376,10 +376,11 @@
<string name="button1">Schaltfläche 1</string> <string name="button1">Schaltfläche 1</string>
<string name="button2">Schaltfläche 2</string> <string name="button2">Schaltfläche 2</string>
<string name="button3">Schaltfläche 3</string> <string name="button3">Schaltfläche 3</string>
<string name="units">Einheiten:</string> <string name="units_colon">Einheiten:</string>
<string name="units">Einheiten</string>
<string name="mgdl">mg/dl</string> <string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string> <string name="mmol">mmol/l</string>
<string name="dia">DIA:</string> <string name="dia">DIA</string>
<string name="target_range">Zielbereich:</string> <string name="target_range">Zielbereich:</string>
<string name="prefs_range_title">Zielbereich für die Grafikanzeige</string> <string name="prefs_range_title">Zielbereich für die Grafikanzeige</string>
<string name="prefs_range_summary">Hoch- und Niedrig-Werte für die Übersicht- und die Smartwatch-Anzeige</string> <string name="prefs_range_summary">Hoch- und Niedrig-Werte für die Übersicht- und die Smartwatch-Anzeige</string>
@ -1392,6 +1393,10 @@ Unerwartetes Verhalten.</string>
<string name="format_percent">%1$d%%</string> <string name="format_percent">%1$d%%</string>
<string name="boluswizard">Bolus-Rechner</string> <string name="boluswizard">Bolus-Rechner</string>
<string name="unit_minute_short">Min.</string> <string name="unit_minute_short">Min.</string>
<string name="profile_name">Profilname:</string>
<string name="selected_profile">Ausgewählt:</string>
<string name="unitsnosemicolon">Einheiten</string>
<string name="doyouwantswitchprofile">Willst Du das Profil wechseln und die Änderungen am aktuellen Profil verwerfen?</string>
<string name="format_carbs">%1$dg</string> <string name="format_carbs">%1$dg</string>
<string name="common_on">Ein</string> <string name="common_on">Ein</string>
<string name="common_off">Aus</string> <string name="common_off">Aus</string>
@ -1399,4 +1404,18 @@ Unerwartetes Verhalten.</string>
<string name="objectives_button_unstart">Löschen gestartet</string> <string name="objectives_button_unstart">Löschen gestartet</string>
<string name="timedetection">Zeiterkennung</string> <string name="timedetection">Zeiterkennung</string>
<string name="doyouwantresetstart">Möchtest Du den Start der Ziele zurücksetzen? Du verlierst Deine Fortschritte.</string> <string name="doyouwantresetstart">Möchtest Du den Start der Ziele zurücksetzen? Du verlierst Deine Fortschritte.</string>
<string name="nopumpselected">Keine Pumpe ausgewählt</string>
<string name="setupwizard_units_prompt">Wähle die Einheit, in der die Werte angezeigt werden sollen.</string>
<string name="ns_ploadlocalprofile">Lade die Änderungen des lokalen Profils zu NS hoch.</string>
<string name="dia_short">DIA</string>
<string name="ic_short">IC</string>
<string name="isf_short">ISF</string>
<string name="target_short">ZIEL</string>
<string name="clone_label">Duplizieren</string>
<string name="saveorresetchangesfirst">Speichere oder verwerfe die aktuellen Änderungen zuerst</string>
<string name="deletecurrentprofile">Aktuelles Profil löschen?</string>
<string name="copytolocalprofile">Neues lokales Profil auf Basis dieses Profilwechsels erstellen?</string>
<string name="profilenamecontainsdot">Profilname enthält Punkte.\nDies wird von NS nicht unterstützt.\nProfil wird nicht zu NS hochgeladen.</string>
<string name="low_mark_comment">Unterer Wert des Zielbereichs (nur Anzeige)</string>
<string name="high_mark_comment">Oberer Wert des Zielbereichs (nur Anzeige)</string>
</resources> </resources>

View file

@ -361,10 +361,8 @@
<string name="button1">Πλήκτρο 1</string> <string name="button1">Πλήκτρο 1</string>
<string name="button2">Πλήκτρο 2</string> <string name="button2">Πλήκτρο 2</string>
<string name="button3">Πλήκτρο 3</string> <string name="button3">Πλήκτρο 3</string>
<string name="units">Μονάδες:</string>
<string name="mgdl">mg/dl</string> <string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string> <string name="mmol">mmol/l</string>
<string name="dia">DIA:</string>
<string name="target_range">Εύρος στόχου:</string> <string name="target_range">Εύρος στόχου:</string>
<string name="prefs_range_title">Εύρος εμφάνισης</string> <string name="prefs_range_title">Εύρος εμφάνισης</string>
<string name="prefs_range_summary">Υψηλό και Χαμηλό σημείο για την γραφική στην Επισκόπηση και Smartwatch</string> <string name="prefs_range_summary">Υψηλό και Χαμηλό σημείο για την γραφική στην Επισκόπηση και Smartwatch</string>

View file

@ -36,6 +36,7 @@
<string name="objectives_useloop">Mostrar contenido del plugin Loop</string> <string name="objectives_useloop">Mostrar contenido del plugin Loop</string>
<string name="objectives_usescale">Usar función de escala mediante un gráfico BG pulsado largo</string> <string name="objectives_usescale">Usar función de escala mediante un gráfico BG pulsado largo</string>
<string name="objectives_button_enter">Intro</string> <string name="objectives_button_enter">Intro</string>
<string name="enter_code_obtained_from_developers_to_bypass_the_rest_of_objectives">Si fuiste usuario de OpenAPS y tu NS tiene al menos 3 meses de datos de lazo cerrado, puedes enviar un correo electrónico a objectives@androidaps.org con tu dirección web de NS y solicitar código para saltarse el resto de objetivos. Ingresa posteriormente el código obtenido de los desarrolladores</string>
<string name="codeaccepted">Código aceptado</string> <string name="codeaccepted">Código aceptado</string>
<string name="codeinvalid">Código no válido</string> <string name="codeinvalid">Código no válido</string>
<string name="objectives_exam_objective">Compruebe su conocimiento</string> <string name="objectives_exam_objective">Compruebe su conocimiento</string>

View file

@ -260,11 +260,23 @@
<string name="smscommunicator_allowednumbers">Números de teléfono permitidos</string> <string name="smscommunicator_allowednumbers">Números de teléfono permitidos</string>
<string name="smscommunicator_allowednumbers_summary">XXXXXXXXXX +; + YYYYYYYYYY</string> <string name="smscommunicator_allowednumbers_summary">XXXXXXXXXX +; + YYYYYYYYYY</string>
<string name="smscommunicator_bolusreplywithcode">Para entregar bolo %1$.2fU responder con código %2$s</string> <string name="smscommunicator_bolusreplywithcode">Para entregar bolo %1$.2fU responder con código %2$s</string>
<string name="smscommunicator_mealbolusreplywithcode">Para entregar bolo %1$.2fU responder con código %2$s</string>
<string name="smscommunicator_temptargetwithcode">Para establecer un basal temporal %1$s responder con el código %2$s</string>
<string name="smscommunicator_temptargetcancel">Para cancelar la basal temporal, responder con el código %1$s</string>
<string name="smscommunicator_stopsmswithcode">Para inhabilitar la respuesta de servicio remoto de SMS, responder con el código %1$s.\n\nTenga en cuenta que solamente será capaz de reactivarlo directamente desde el móvil con la AAPS maestro.</string>
<string name="smscommunicator_stoppedsms">Servicio remoto de SMS detenido. Para reactivarlo, utilice AAPS en el movil maestro.</string>
<string name="smscommunicator_calibrationreplywithcode">Para enviar calibración %1$.2f responder con código %2$s</string> <string name="smscommunicator_calibrationreplywithcode">Para enviar calibración %1$.2f responder con código %2$s</string>
<string name="smscommunicator_bolusfailed">Bolo falló</string> <string name="smscommunicator_bolusfailed">Bolo falló</string>
<string name="smscommunicator_remotebolusmindistance_summary">Número mínimo de minutos que deben transcursar entre un bolus remoto y el siguiente</string>
<string name="smscommunicator_remotebolusmindistance">Cuántos minutos deben transcurrir, al menos, entre un bolo y el siguiente</string>
<string name="smscommunicator_remotebolusmindistance_caveat">Por su seguridad, para editar esta preferencia es necesario añadir al menos 2 números de teléfono.</string>
<string name="bolusdelivered">El bolo %1$.2fU se ha infundido correctamente</string> <string name="bolusdelivered">El bolo %1$.2fU se ha infundido correctamente</string>
<string name="bolusrequested">Se van a infundir %1$.2fU</string> <string name="bolusrequested">Se van a infundir %1$.2fU</string>
<string name="smscommunicator_bolusdelivered">El bolo %1$.2fU se ha infundido correctamente</string> <string name="smscommunicator_bolusdelivered">El bolo %1$.2fU se ha infundido correctamente</string>
<string name="smscommunicator_mealbolusdelivered">Bolo %1$.2fU entregado correctamente</string>
<string name="smscommunicator_mealbolusdelivered_tt">Objetivo %1$s para %2$d minutos</string>
<string name="smscommunicator_tt_set">Objetivo %1$s para %2$d minutos establecido correctamente</string>
<string name="smscommunicator_tt_canceled">Objetivo temporal cancelado con éxito</string>
<string name="bolusdelivering">Infundiendo %1$.2fU</string> <string name="bolusdelivering">Infundiendo %1$.2fU</string>
<string name="smscommunicator_remotecommandsallowed">Permitir comandos remotos vía SMS</string> <string name="smscommunicator_remotecommandsallowed">Permitir comandos remotos vía SMS</string>
<string name="glucosetype_finger">Dedo</string> <string name="glucosetype_finger">Dedo</string>
@ -324,10 +336,13 @@
<string name="smscommunicator_basalreplywithcode">Para iniciar una basal de %1$.2f% durante %2$d min, responder con el código %3$s</string> <string name="smscommunicator_basalreplywithcode">Para iniciar una basal de %1$.2f% durante %2$d min, responder con el código %3$s</string>
<string name="smscommunicator_profilereplywithcode">Para cambiar el perfil a %1$s %2$d%% responder con el código %3$s</string> <string name="smscommunicator_profilereplywithcode">Para cambiar el perfil a %1$s %2$d%% responder con el código %3$s</string>
<string name="smscommunicator_extendedreplywithcode">Para iniciar un bolo extendido de %1$.2fU durante %2$d minutos, responder con el código %3$s</string> <string name="smscommunicator_extendedreplywithcode">Para iniciar un bolo extendido de %1$.2fU durante %2$d minutos, responder con el código %3$s</string>
<string name="smscommunicator_carbsreplywithcode">Para introducir %1$dg en %2$s responder con código %3$s</string>
<string name="smscommunicator_basalpctreplywithcode">Para iniciar una basal de %1$d%% durante %2$d min, responder con el código %3$s</string> <string name="smscommunicator_basalpctreplywithcode">Para iniciar una basal de %1$d%% durante %2$d min, responder con el código %3$s</string>
<string name="smscommunicator_suspendreplywithcode">Para cancelar lazo por %1$d minutos responde con código %2$s</string> <string name="smscommunicator_suspendreplywithcode">Para cancelar lazo por %1$d minutos responde con código %2$s</string>
<string name="smscommunicator_tempbasalset">Basal temporal %1$.2fU/h para %2$d min iniciada correctamente</string> <string name="smscommunicator_tempbasalset">Basal temporal %1$.2fU/h para %2$d min iniciada correctamente</string>
<string name="smscommunicator_extendedset">Bolo ampliado de %1$.2fU durante %2$d min se inició correctamente</string> <string name="smscommunicator_extendedset">Bolo ampliado de %1$.2fU durante %2$d min se inició correctamente</string>
<string name="smscommunicator_carbsset">Los carbohidratos %1$dg introducidos con éxito</string>
<string name="smscommunicator_carbsfailed">Error al introducir %1$dg de carbohidratos</string>
<string name="smscommunicator_tempbasalset_percent">Basal temporal de %1$d%% durante %2$d min iniciada correctamente</string> <string name="smscommunicator_tempbasalset_percent">Basal temporal de %1$d%% durante %2$d min iniciada correctamente</string>
<string name="smscommunicator_tempbasalfailed">Fallo inicio basal temporal</string> <string name="smscommunicator_tempbasalfailed">Fallo inicio basal temporal</string>
<string name="smscommunicator_extendedfailed">Error al iniciar el bolo extendido</string> <string name="smscommunicator_extendedfailed">Error al iniciar el bolo extendido</string>
@ -361,10 +376,8 @@
<string name="button1">Botón 1</string> <string name="button1">Botón 1</string>
<string name="button2">Botón 2</string> <string name="button2">Botón 2</string>
<string name="button3">Botón 3</string> <string name="button3">Botón 3</string>
<string name="units">Unidades:</string>
<string name="mgdl">mg/dl</string> <string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string> <string name="mmol">mmol/l</string>
<string name="dia">DIA (Duración Insulina Activa):</string>
<string name="target_range">Rango Objetivo:</string> <string name="target_range">Rango Objetivo:</string>
<string name="prefs_range_title">Rango de visualización</string> <string name="prefs_range_title">Rango de visualización</string>
<string name="prefs_range_summary">Marcas Alta y Baja para gráficos en pantalla Inicio y Smartwatch</string> <string name="prefs_range_summary">Marcas Alta y Baja para gráficos en pantalla Inicio y Smartwatch</string>
@ -680,6 +693,7 @@
<string name="shortgramm">g</string> <string name="shortgramm">g</string>
<string name="shortminute">m</string> <string name="shortminute">m</string>
<string name="shorthour">h</string> <string name="shorthour">h</string>
<string name="shortday">d</string>
<string name="none"><![CDATA[<ninguno>]]></string> <string name="none"><![CDATA[<ninguno>]]></string>
<string name="shortkilojoul">kJ</string> <string name="shortkilojoul">kJ</string>
<string name="shortenergy">En</string> <string name="shortenergy">En</string>
@ -708,6 +722,7 @@
<string name="bgsource_upload">Ajuste de subida de datos de glucosa</string> <string name="bgsource_upload">Ajuste de subida de datos de glucosa</string>
<string name="wear_detailed_delta_title">Mostrar detalles delta</string> <string name="wear_detailed_delta_title">Mostrar detalles delta</string>
<string name="wear_detailed_delta_summary">Mostrar delta con un decimal mas</string> <string name="wear_detailed_delta_summary">Mostrar delta con un decimal mas</string>
<string name="smbmaxminutes">Minutos máximos SMB</string>
<string name="smbmaxminutes_summary">Minutos máximos de basal para limitar SMB</string> <string name="smbmaxminutes_summary">Minutos máximos de basal para limitar SMB</string>
<string name="unsupportedfirmware">Firmware de la bomba no soportado</string> <string name="unsupportedfirmware">Firmware de la bomba no soportado</string>
<string name="dexcomg5_xdripupload_title">Mandar datos BG a xDrip+</string> <string name="dexcomg5_xdripupload_title">Mandar datos BG a xDrip+</string>
@ -1377,4 +1392,8 @@
<string name="format_carbs">%1$dg</string> <string name="format_carbs">%1$dg</string>
<string name="common_on">Activado</string> <string name="common_on">Activado</string>
<string name="common_off">Desactivado</string> <string name="common_off">Desactivado</string>
<string name="objectives_button_unfinish">Limpieza finalizada</string>
<string name="objectives_button_unstart">Limpieza iniciada</string>
<string name="timedetection">Detección de tiempo</string>
<string name="doyouwantresetstart">¿Desea reiniciar el objetivo? Puedes perder tu progreso.</string>
</resources> </resources>

View file

@ -205,7 +205,7 @@
<string name="careportal_newnstreatment_carbtime_label">Heure glucides</string> <string name="careportal_newnstreatment_carbtime_label">Heure glucides</string>
<string name="careportal_newnstreatment_split_label">Diviser</string> <string name="careportal_newnstreatment_split_label">Diviser</string>
<string name="careportal_newnstreatment_duration_label">Durée</string> <string name="careportal_newnstreatment_duration_label">Durée</string>
<string name="careportal_newnstreatment_percent_label">Pour cent</string> <string name="careportal_newnstreatment_percent_label">Pourcentage</string>
<string name="careportal_newnstreatment_absolute_label">Absolu</string> <string name="careportal_newnstreatment_absolute_label">Absolu</string>
<string name="careportal_newnstreatment_notes_label">Notes</string> <string name="careportal_newnstreatment_notes_label">Notes</string>
<string name="careportal_newnstreatment_eventtime_label">Heure de l\'événement</string> <string name="careportal_newnstreatment_eventtime_label">Heure de l\'événement</string>
@ -253,7 +253,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="enacted">Activé</string> <string name="enacted">Activé</string>
<string name="comment">Commentaire</string> <string name="comment">Commentaire</string>
<string name="success">Succès</string> <string name="success">Succès</string>
<string name="percent">Pour cent</string> <string name="percent">Pourcentage</string>
<string name="absolute">Absolu</string> <string name="absolute">Absolu</string>
<string name="canceltemp">Annuler le basal temporaire</string> <string name="canceltemp">Annuler le basal temporaire</string>
<string name="smscommunicator">Communicateur SMS</string> <string name="smscommunicator">Communicateur SMS</string>
@ -377,10 +377,8 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="button1">Bouton 1</string> <string name="button1">Bouton 1</string>
<string name="button2">Bouton 2</string> <string name="button2">Bouton 2</string>
<string name="button3">Bouton 3</string> <string name="button3">Bouton 3</string>
<string name="units">Unités :</string>
<string name="mgdl">mg/dl</string> <string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string> <string name="mmol">mmol/l</string>
<string name="dia">DAI :</string>
<string name="target_range">Fourchette cible :</string> <string name="target_range">Fourchette cible :</string>
<string name="prefs_range_title">Fourchette de visualisation</string> <string name="prefs_range_title">Fourchette de visualisation</string>
<string name="prefs_range_summary">Les repères hauts et bas sur les graphiques pour l\'aperçu et la montre</string> <string name="prefs_range_summary">Les repères hauts et bas sur les graphiques pour l\'aperçu et la montre</string>

View file

@ -376,10 +376,11 @@
<string name="button1">Tasto 1</string> <string name="button1">Tasto 1</string>
<string name="button2">Tasto 2</string> <string name="button2">Tasto 2</string>
<string name="button3">Tasto 3</string> <string name="button3">Tasto 3</string>
<string name="units">Unità:</string> <string name="units_colon">Unità:</string>
<string name="units">Unità</string>
<string name="mgdl">mg/dl</string> <string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string> <string name="mmol">mmol/l</string>
<string name="dia">DIA:</string> <string name="dia">DIA</string>
<string name="target_range">Intervallo target:</string> <string name="target_range">Intervallo target:</string>
<string name="prefs_range_title">Intervallo di visualizzazione</string> <string name="prefs_range_title">Intervallo di visualizzazione</string>
<string name="prefs_range_summary">Limite alto e basso per i grafici nella sezione Panoramica e sullo Smartwatch</string> <string name="prefs_range_summary">Limite alto e basso per i grafici nella sezione Panoramica e sullo Smartwatch</string>
@ -852,7 +853,7 @@
<string name="combo_activity_checking_pump_state">Aggiornamento stato micro</string> <string name="combo_activity_checking_pump_state">Aggiornamento stato micro</string>
<string name="combo_warning_pump_basal_rate_changed">La velocità basale nel micro è cambiata e verrà aggiornata a breve</string> <string name="combo_warning_pump_basal_rate_changed">La velocità basale nel micro è cambiata e verrà aggiornata a breve</string>
<string name="combo_error_failure_reading_changed_basal_rate">Velocità basale cambiata sul micro, ma la sua lettura è fallita</string> <string name="combo_error_failure_reading_changed_basal_rate">Velocità basale cambiata sul micro, ma la sua lettura è fallita</string>
<string name="combo_activity_checking_for_history_changes">Controllo delle modifiche allo storico</string> <string name="combo_activity_checking_for_history_changes">Controllo modifiche allo storico</string>
<string name="combo_error_multiple_boluses_with_identical_timestamp">Sono appena stati importati più boli con la stessa quantità nello stesso minuto. Solo un record può essere aggiunto ai trattamenti. Controlla il micro e aggiungi manualmente un record di bolo utilizzando la sezione Portale. Assicurati di creare un bolo con un orario non utilizzato da nessun altro bolo.</string> <string name="combo_error_multiple_boluses_with_identical_timestamp">Sono appena stati importati più boli con la stessa quantità nello stesso minuto. Solo un record può essere aggiunto ai trattamenti. Controlla il micro e aggiungi manualmente un record di bolo utilizzando la sezione Portale. Assicurati di creare un bolo con un orario non utilizzato da nessun altro bolo.</string>
<string name="about_link_urls">\n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)</string> <string name="about_link_urls">\n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)</string>
<string name="combo_check_date">L\'ultimo bolo è più vecchio di 24 ore o ha una data nel futuro. Controlla che la data sul micro sia impostata correttamente.</string> <string name="combo_check_date">L\'ultimo bolo è più vecchio di 24 ore o ha una data nel futuro. Controlla che la data sul micro sia impostata correttamente.</string>
@ -1391,6 +1392,10 @@
<string name="format_percent">%1$d%%</string> <string name="format_percent">%1$d%%</string>
<string name="boluswizard">Calcolatore</string> <string name="boluswizard">Calcolatore</string>
<string name="unit_minute_short">min</string> <string name="unit_minute_short">min</string>
<string name="profile_name">Nome profilo:</string>
<string name="selected_profile">Selezionato:</string>
<string name="unitsnosemicolon">Unità</string>
<string name="doyouwantswitchprofile">Vuoi cambiare profilo e scartare le modifiche apportate al profilo corrente?</string>
<string name="format_carbs">%1$dg</string> <string name="format_carbs">%1$dg</string>
<string name="common_on">On</string> <string name="common_on">On</string>
<string name="common_off">Off</string> <string name="common_off">Off</string>
@ -1398,4 +1403,18 @@
<string name="objectives_button_unstart">Cancella avviato</string> <string name="objectives_button_unstart">Cancella avviato</string>
<string name="timedetection">Rilevazione tempo</string> <string name="timedetection">Rilevazione tempo</string>
<string name="doyouwantresetstart">Vuoi resettare l\'avvio dell\'obiettivo? Potresti perdere i tuoi progressi.</string> <string name="doyouwantresetstart">Vuoi resettare l\'avvio dell\'obiettivo? Potresti perdere i tuoi progressi.</string>
<string name="nopumpselected">Nessun micro selezionato</string>
<string name="setupwizard_units_prompt">Seleziona le unità in cui vuoi visualizzare i valori</string>
<string name="ns_ploadlocalprofile">Carica modifiche al profilo locale in NS</string>
<string name="dia_short">DIA</string>
<string name="ic_short">IC</string>
<string name="isf_short">ISF</string>
<string name="target_short">TARG</string>
<string name="clone_label">Clona</string>
<string name="saveorresetchangesfirst">Salva o reimposta prima le modifiche correnti</string>
<string name="deletecurrentprofile">Rimuovere il profilo corrente?</string>
<string name="copytolocalprofile">Creare nuovo profilo locale da questo cambio profilo?</string>
<string name="profilenamecontainsdot">Il nome profilo contiene dei punti.\nQuesto non è supportato da NS.\nIl profilo non viene caricato in NS.</string>
<string name="low_mark_comment">Valore più basso per l\'intervallo di visualizzazione dell\'area \"in range\"</string>
<string name="high_mark_comment">Valore più alto per l\'intervallo di visualizzazione dell\'area \"in range\"</string>
</resources> </resources>

View file

@ -359,10 +359,8 @@
<string name="button1">버튼1</string> <string name="button1">버튼1</string>
<string name="button2">버튼2</string> <string name="button2">버튼2</string>
<string name="button3">버튼3</string> <string name="button3">버튼3</string>
<string name="units">유닛:</string>
<string name="mgdl">mg/dl</string> <string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string> <string name="mmol">mmol/l</string>
<string name="dia">DIA:</string>
<string name="target_range">목표 범위:</string> <string name="target_range">목표 범위:</string>
<string name="prefs_range_title">차트 표시 범위</string> <string name="prefs_range_title">차트 표시 범위</string>
<string name="prefs_range_summary">스마트워치 차트 고/저혈당 선</string> <string name="prefs_range_summary">스마트워치 차트 고/저혈당 선</string>

View file

@ -361,10 +361,8 @@
<string name="button1">Mygtukas 1</string> <string name="button1">Mygtukas 1</string>
<string name="button2">Mygtukas 2</string> <string name="button2">Mygtukas 2</string>
<string name="button3">Mygtukas 3</string> <string name="button3">Mygtukas 3</string>
<string name="units">Vienetai:</string>
<string name="mgdl">mg/dl</string> <string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string> <string name="mmol">mmol/l</string>
<string name="dia">IVT:</string>
<string name="target_range">Tikslinis diapazonas:</string> <string name="target_range">Tikslinis diapazonas:</string>
<string name="prefs_range_title">Vizualizacijos diapazonas</string> <string name="prefs_range_title">Vizualizacijos diapazonas</string>
<string name="prefs_range_summary">Aukštoji ir žemoji riba Apžvalgos grafikuose bei išmaniuosiuose laikrodžiuose</string> <string name="prefs_range_summary">Aukštoji ir žemoji riba Apžvalgos grafikuose bei išmaniuosiuose laikrodžiuose</string>

View file

@ -376,10 +376,8 @@
<string name="button1">Knop 1</string> <string name="button1">Knop 1</string>
<string name="button2">Knop 2</string> <string name="button2">Knop 2</string>
<string name="button3">Knop 3</string> <string name="button3">Knop 3</string>
<string name="units">Eenheden:</string>
<string name="mgdl">mg/dl</string> <string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string> <string name="mmol">mmol/l</string>
<string name="dia">DIA:</string>
<string name="target_range">Streefdoel:</string> <string name="target_range">Streefdoel:</string>
<string name="prefs_range_title">Bereik voor visualisatie</string> <string name="prefs_range_title">Bereik voor visualisatie</string>
<string name="prefs_range_summary">Hoge en lage grens voor grafieken op het Overzicht en op Wear</string> <string name="prefs_range_summary">Hoge en lage grens voor grafieken op het Overzicht en op Wear</string>
@ -591,7 +589,7 @@
<string name="hours">uren</string> <string name="hours">uren</string>
<string name="overview_newtempbasal_basaltype_label">Basaal type</string> <string name="overview_newtempbasal_basaltype_label">Basaal type</string>
<string name="invalidprofile">Ongeldig profiel !!!</string> <string name="invalidprofile">Ongeldig profiel !!!</string>
<string name="profileswitch">Wisselen van profiel</string> <string name="profileswitch">Profiel Wissel</string>
<string name="careportal_pbage_label">Ouderdom batterij</string> <string name="careportal_pbage_label">Ouderdom batterij</string>
<string name="careportal_pumpbatterychange">Pomp bat. wissel</string> <string name="careportal_pumpbatterychange">Pomp bat. wissel</string>
<string name="ns_alarmoptions">Alarm opties</string> <string name="ns_alarmoptions">Alarm opties</string>

View file

@ -361,10 +361,8 @@
<string name="button1">Przycisk 1</string> <string name="button1">Przycisk 1</string>
<string name="button2">Przycisk 2</string> <string name="button2">Przycisk 2</string>
<string name="button3">Przycisk 3</string> <string name="button3">Przycisk 3</string>
<string name="units">Jednostki:</string>
<string name="mgdl">mg/dl</string> <string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string> <string name="mmol">mmol/l</string>
<string name="dia">DIA:</string>
<string name="target_range">Zakres docelowy:</string> <string name="target_range">Zakres docelowy:</string>
<string name="prefs_range_title">Zakres do wizualizacji (na wykresie)</string> <string name="prefs_range_title">Zakres do wizualizacji (na wykresie)</string>
<string name="prefs_range_summary">Oznaczenia wysokiego i niskiego cukru na wykresie w oknie przegląd i na smartwatch\'u</string> <string name="prefs_range_summary">Oznaczenia wysokiego i niskiego cukru na wykresie w oknie przegląd i na smartwatch\'u</string>
@ -1378,4 +1376,8 @@
<string name="format_carbs">%1$dg</string> <string name="format_carbs">%1$dg</string>
<string name="common_on">Włącz</string> <string name="common_on">Włącz</string>
<string name="common_off">Wyłącz</string> <string name="common_off">Wyłącz</string>
<string name="objectives_button_unfinish">Wyczyść skończone</string>
<string name="objectives_button_unstart">Wyczyść rozpoczęte</string>
<string name="timedetection">Wykrywanie czasu</string>
<string name="doyouwantresetstart">Czy chcesz zresetować czas rozpoczęcia zadania? Możesz utracić postępy.</string>
</resources> </resources>

View file

@ -361,10 +361,8 @@
<string name="button1">Botão 1</string> <string name="button1">Botão 1</string>
<string name="button2">Botão 2</string> <string name="button2">Botão 2</string>
<string name="button3">Botão 3</string> <string name="button3">Botão 3</string>
<string name="units">Unidades:</string>
<string name="mgdl">mg/dL</string> <string name="mgdl">mg/dL</string>
<string name="mmol">mmol/L</string> <string name="mmol">mmol/L</string>
<string name="dia">DIA:</string>
<string name="target_range">Intervalo Alvo:</string> <string name="target_range">Intervalo Alvo:</string>
<string name="prefs_range_title">Intervalo para visualização</string> <string name="prefs_range_title">Intervalo para visualização</string>
<string name="prefs_range_summary">Marca alta e baixa para as cartas em Visão geral e Smartwatch</string> <string name="prefs_range_summary">Marca alta e baixa para as cartas em Visão geral e Smartwatch</string>

View file

@ -210,7 +210,7 @@
<string name="careportal_newnstreatment_notes_label">Notas</string> <string name="careportal_newnstreatment_notes_label">Notas</string>
<string name="careportal_newnstreatment_eventtime_label">Tempo do evento</string> <string name="careportal_newnstreatment_eventtime_label">Tempo do evento</string>
<string name="careportal_newnstreatment_profile_label">Perfil</string> <string name="careportal_newnstreatment_profile_label">Perfil</string>
<string name="careportal_newnstreatment_enteredby_title">Introduzido por</string> <string name="careportal_newnstreatment_enteredby_title">Inserido por</string>
<string name="careportal_newnstreatment_glucosetype">Tipo de glicose</string> <string name="careportal_newnstreatment_glucosetype">Tipo de glicose</string>
<string name="noprofile">Sem perfil carregado do NS</string> <string name="noprofile">Sem perfil carregado do NS</string>
<string name="overview_tempbasal_button">BasalTemp</string> <string name="overview_tempbasal_button">BasalTemp</string>
@ -265,6 +265,9 @@
<string name="bolusdelivered">Bólus %1$.2fU enviado com êxito</string> <string name="bolusdelivered">Bólus %1$.2fU enviado com êxito</string>
<string name="bolusrequested">Vai ser enviado %1$.2fU</string> <string name="bolusrequested">Vai ser enviado %1$.2fU</string>
<string name="smscommunicator_bolusdelivered">Bólus %1$.2fU enviado com êxito</string> <string name="smscommunicator_bolusdelivered">Bólus %1$.2fU enviado com êxito</string>
<string name="smscommunicator_mealbolusdelivered_tt">Alvo %1$s para %2$d minutos</string>
<string name="smscommunicator_tt_set">Alvo %1$s para %2$d minutos definido com sucesso</string>
<string name="smscommunicator_tt_canceled">Alvo Temp cancelado com êxito</string>
<string name="bolusdelivering">A enviar %1$.2fU</string> <string name="bolusdelivering">A enviar %1$.2fU</string>
<string name="smscommunicator_remotecommandsallowed">Permitir comandos remotos via SMS</string> <string name="smscommunicator_remotecommandsallowed">Permitir comandos remotos via SMS</string>
<string name="glucosetype_finger">Dedo</string> <string name="glucosetype_finger">Dedo</string>
@ -324,10 +327,13 @@
<string name="smscommunicator_basalreplywithcode">Para começar a basal %1$.2fU/h durante%2$d min responda com o código %3$s</string> <string name="smscommunicator_basalreplywithcode">Para começar a basal %1$.2fU/h durante%2$d min responda com o código %3$s</string>
<string name="smscommunicator_profilereplywithcode">Para mudar o perfil para %1$s %2$d%% responda com o código %3$s</string> <string name="smscommunicator_profilereplywithcode">Para mudar o perfil para %1$s %2$d%% responda com o código %3$s</string>
<string name="smscommunicator_extendedreplywithcode">Para começar o bólus estendido %1$.2fU/h para %2$d min responda com o código %3$s</string> <string name="smscommunicator_extendedreplywithcode">Para começar o bólus estendido %1$.2fU/h para %2$d min responda com o código %3$s</string>
<string name="smscommunicator_carbsreplywithcode">Para inserir %1$dg em %2$s responda com código %3$s</string>
<string name="smscommunicator_basalpctreplywithcode">Para começar a basal %1$d% U/h durante %2$d min responda com o código %3$s</string> <string name="smscommunicator_basalpctreplywithcode">Para começar a basal %1$d% U/h durante %2$d min responda com o código %3$s</string>
<string name="smscommunicator_suspendreplywithcode">Para suspender o loop por %1$d minutos resposta com código %2$s</string> <string name="smscommunicator_suspendreplywithcode">Para suspender o loop por %1$d minutos resposta com código %2$s</string>
<string name="smscommunicator_tempbasalset">Basal temporária %1$.2fU/h para %2$d min iniciada com êxito</string> <string name="smscommunicator_tempbasalset">Basal temporária %1$.2fU/h para %2$d min iniciada com êxito</string>
<string name="smscommunicator_extendedset">Bólus estendido %1$.2fU/h para %2$d min iniciado com êxito</string> <string name="smscommunicator_extendedset">Bólus estendido %1$.2fU/h para %2$d min iniciado com êxito</string>
<string name="smscommunicator_carbsset">Hidratos %1$dg inseridos com sucesso</string>
<string name="smscommunicator_carbsfailed">Introdução de %1$dg de hidratos falhou</string>
<string name="smscommunicator_tempbasalset_percent">Basal temporária %1$d% U/h durante%2$d min iniciada com êxito</string> <string name="smscommunicator_tempbasalset_percent">Basal temporária %1$d% U/h durante%2$d min iniciada com êxito</string>
<string name="smscommunicator_tempbasalfailed">Início basal temp falhou </string> <string name="smscommunicator_tempbasalfailed">Início basal temp falhou </string>
<string name="smscommunicator_extendedfailed">Falha ao iniciar o bólus estendido</string> <string name="smscommunicator_extendedfailed">Falha ao iniciar o bólus estendido</string>
@ -361,10 +367,11 @@
<string name="button1">Botão 1</string> <string name="button1">Botão 1</string>
<string name="button2">Botão 2</string> <string name="button2">Botão 2</string>
<string name="button3">Botão 3</string> <string name="button3">Botão 3</string>
<string name="units">Unidades:</string> <string name="units_colon">Unidades:</string>
<string name="units">Unidades</string>
<string name="mgdl">mg/dL</string> <string name="mgdl">mg/dL</string>
<string name="mmol">mmol/L</string> <string name="mmol">mmol/L</string>
<string name="dia">DIA:</string> <string name="dia">DIA</string>
<string name="target_range">Intervalo Alvo:</string> <string name="target_range">Intervalo Alvo:</string>
<string name="prefs_range_title">Intervalo para visualização</string> <string name="prefs_range_title">Intervalo para visualização</string>
<string name="prefs_range_summary">Marca Alto e Baixo para os gráficos em Sumário e Smartwatch</string> <string name="prefs_range_summary">Marca Alto e Baixo para os gráficos em Sumário e Smartwatch</string>
@ -1376,7 +1383,25 @@
<string name="format_percent">%1$d%%</string> <string name="format_percent">%1$d%%</string>
<string name="boluswizard">Assistente de Bólus</string> <string name="boluswizard">Assistente de Bólus</string>
<string name="unit_minute_short">min</string> <string name="unit_minute_short">min</string>
<string name="profile_name">Nome do Perfil:</string>
<string name="selected_profile">Seleccionado:</string>
<string name="unitsnosemicolon">Unidades</string>
<string name="doyouwantswitchprofile">Deseja mudar de perfil e descartar as alterações feitas no perfil actual?</string>
<string name="format_carbs">%1$dg</string> <string name="format_carbs">%1$dg</string>
<string name="common_on">Ligado</string> <string name="common_on">Ligado</string>
<string name="common_off">Desligado</string> <string name="common_off">Desligado</string>
<string name="objectives_button_unfinish">Limpar terminado</string>
<string name="objectives_button_unstart">Limpar iniciado</string>
<string name="timedetection">Detecção de tempo</string>
<string name="nopumpselected">Nenhuma bomba seleccionada</string>
<string name="setupwizard_units_prompt">Seleccione as unidades em que deseja exibir os valores</string>
<string name="ns_ploadlocalprofile">Carregar as alterações do perfil local para NS</string>
<string name="dia_short">DIA</string>
<string name="ic_short">IC</string>
<string name="isf_short">FSI</string>
<string name="target_short">ALV</string>
<string name="clone_label">Clone</string>
<string name="deletecurrentprofile">Eliminar perfil actual?</string>
<string name="copytolocalprofile">Criar novo perfil local a partir desta troca de perfil?</string>
<string name="profilenamecontainsdot">Nome do perfil contém pontos.\nIsso não é suportado pelo NS.\nPerfil não é enviado para o NS.</string>
</resources> </resources>

View file

@ -360,10 +360,8 @@
<string name="button1">Buton 1</string> <string name="button1">Buton 1</string>
<string name="button2">Buton 2</string> <string name="button2">Buton 2</string>
<string name="button3">Buton 3</string> <string name="button3">Buton 3</string>
<string name="units">Unități:</string>
<string name="mgdl">mg/dl</string> <string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string> <string name="mmol">mmol/l</string>
<string name="dia">DIA:</string>
<string name="target_range">Intervalul țintă:</string> <string name="target_range">Intervalul țintă:</string>
<string name="prefs_range_title">Intervalul pentru vizualizare</string> <string name="prefs_range_title">Intervalul pentru vizualizare</string>
<string name="prefs_range_summary">Valoarea maximă și minimă pentru graficele din vizualizare și pentru smartwatch</string> <string name="prefs_range_summary">Valoarea maximă și minimă pentru graficele din vizualizare și pentru smartwatch</string>

View file

@ -376,10 +376,8 @@
<string name="button1">кнопка 1</string> <string name="button1">кнопка 1</string>
<string name="button2">кнопка 2</string> <string name="button2">кнопка 2</string>
<string name="button3">кнопка 3</string> <string name="button3">кнопка 3</string>
<string name="units">единицы измерения:</string>
<string name="mgdl">мг/дл</string> <string name="mgdl">мг/дл</string>
<string name="mmol">ммоль/л</string> <string name="mmol">ммоль/л</string>
<string name="dia">Время действия инсулина DIA:</string>
<string name="target_range">целевой диапазон</string> <string name="target_range">целевой диапазон</string>
<string name="prefs_range_title">диапазон для визуализации</string> <string name="prefs_range_title">диапазон для визуализации</string>
<string name="prefs_range_summary">Нижняя и верхняя граница диаграммы в отчетах и Smartwatch</string> <string name="prefs_range_summary">Нижняя и верхняя граница диаграммы в отчетах и Smartwatch</string>
@ -1396,4 +1394,8 @@ Context | Edit Context</string>
<string name="format_carbs">%1$d гр</string> <string name="format_carbs">%1$d гр</string>
<string name="common_on">Вкл.</string> <string name="common_on">Вкл.</string>
<string name="common_off">Выкл.</string> <string name="common_off">Выкл.</string>
<string name="objectives_button_unfinish">Очистить завершенные</string>
<string name="objectives_button_unstart">Очистить начатые</string>
<string name="timedetection">Определение времени</string>
<string name="doyouwantresetstart">Хотите сбросить начатую цель? Можете потерять уже достигнутое.</string>
</resources> </resources>

View file

@ -376,10 +376,11 @@
<string name="button1">Tlačidlo 1</string> <string name="button1">Tlačidlo 1</string>
<string name="button2">Tlačidlo 2</string> <string name="button2">Tlačidlo 2</string>
<string name="button3">Tlačidlo 3</string> <string name="button3">Tlačidlo 3</string>
<string name="units">Jednotky:</string> <string name="units_colon">Jednotky:</string>
<string name="units">Jednotky</string>
<string name="mgdl">mg/dL</string> <string name="mgdl">mg/dL</string>
<string name="mmol">mmol/L</string> <string name="mmol">mmol/L</string>
<string name="dia">DIA:</string> <string name="dia">DIA</string>
<string name="target_range">Cieľový rozsah:</string> <string name="target_range">Cieľový rozsah:</string>
<string name="prefs_range_title">Rozsah pre zobrazenie</string> <string name="prefs_range_title">Rozsah pre zobrazenie</string>
<string name="prefs_range_summary">Značka vysokej a nízkej hodnoty v prehľade a na hodinkách Wear</string> <string name="prefs_range_summary">Značka vysokej a nízkej hodnoty v prehľade a na hodinkách Wear</string>
@ -521,7 +522,7 @@
<string name="child">Dieťa</string> <string name="child">Dieťa</string>
<string name="teenage">Dospievajúci</string> <string name="teenage">Dospievajúci</string>
<string name="adult">Dospelý</string> <string name="adult">Dospelý</string>
<string name="resistantadult">Dospelý z nízkou citlivosťou</string> <string name="resistantadult">Dospelý s nízkou citlivosťou</string>
<string name="patientage_summary">Vyberte vek pacienta pre nastavenie bezpečnostných limitov</string> <string name="patientage_summary">Vyberte vek pacienta pre nastavenie bezpečnostných limitov</string>
<string name="Glimp">Glimp</string> <string name="Glimp">Glimp</string>
<string name="needwhitelisting">%1$s potrebuje vypnúť optimalizáciu batérie pre optimálny výkon</string> <string name="needwhitelisting">%1$s potrebuje vypnúť optimalizáciu batérie pre optimálny výkon</string>
@ -977,7 +978,7 @@
<string name="option_off">VYP</string> <string name="option_off">VYP</string>
<string name="open_navigation">Otvoriť Menu</string> <string name="open_navigation">Otvoriť Menu</string>
<string name="close_navigation">Zavrieť Menu</string> <string name="close_navigation">Zavrieť Menu</string>
<string name="nav_plugin_preferences">Nastavenie modulov</string> <string name="nav_plugin_preferences">Nastavenie modulu</string>
<string name="completed_well_done">Hotovo, gratulujeme!</string> <string name="completed_well_done">Hotovo, gratulujeme!</string>
<string name="not_completed_yet">Nedokončené</string> <string name="not_completed_yet">Nedokončené</string>
<string name="time_elapsed">Uplynutý čas</string> <string name="time_elapsed">Uplynutý čas</string>
@ -1391,7 +1392,29 @@
<string name="format_percent">%1$d%%</string> <string name="format_percent">%1$d%%</string>
<string name="boluswizard">Bolusová kalkulačka</string> <string name="boluswizard">Bolusová kalkulačka</string>
<string name="unit_minute_short">min</string> <string name="unit_minute_short">min</string>
<string name="profile_name">Názov profilu:</string>
<string name="selected_profile">Vybrané:</string>
<string name="unitsnosemicolon">Jednotky</string>
<string name="doyouwantswitchprofile">Chcete prepnúť profil a zahodiť zmeny vykonané v aktuálnom profile?</string>
<string name="format_carbs">%1$dg</string> <string name="format_carbs">%1$dg</string>
<string name="common_on">ZAP</string> <string name="common_on">ZAP</string>
<string name="common_off">VYP</string> <string name="common_off">VYP</string>
<string name="objectives_button_unfinish">Vymazanie dokončené</string>
<string name="objectives_button_unstart">Vymazanie začaté</string>
<string name="timedetection">Detekcia času</string>
<string name="doyouwantresetstart">Chcete resetovať začiatok cieľa? Môžete prísť o svoj pokrok.</string>
<string name="nopumpselected">Nie je vybraná žiadna pumpa</string>
<string name="setupwizard_units_prompt">Vyberte jednotky, v ktorých chcete zobraziť hodnoty</string>
<string name="ns_ploadlocalprofile">Odoslať zmeny lokálneho profilu do NS</string>
<string name="dia_short">Doba pôsobenia inzulínu</string>
<string name="ic_short">I:C</string>
<string name="isf_short">ISF</string>
<string name="target_short">CIEĽ</string>
<string name="clone_label">Klonovať</string>
<string name="saveorresetchangesfirst">Najskôr uložte, alebo resetujte aktuálne zmeny</string>
<string name="deletecurrentprofile">Zmazať aktuálny profil?</string>
<string name="copytolocalprofile">Chcete vytvoriť nový lokálny profil z tohto prepnutia profilu?</string>
<string name="profilenamecontainsdot">Názov profilu obsahuje bodky.\nToto nie je podporované v NS.\nProfil nebude prenesený do NS.</string>
<string name="low_mark_comment">Spodná hodnota v oblasti cieľového rozsahu (iba zobrazovanie)</string>
<string name="high_mark_comment">Horná hodnota v oblasti cieľového rozsahu (iba zobrazovanie)</string>
</resources> </resources>

View file

@ -377,10 +377,8 @@ Eversense-appen.</string>
<string name="button1">Knapp 1</string> <string name="button1">Knapp 1</string>
<string name="button2">Knapp 2</string> <string name="button2">Knapp 2</string>
<string name="button3">Knapp 3</string> <string name="button3">Knapp 3</string>
<string name="units">Enheter:</string>
<string name="mgdl">mg/dl</string> <string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string> <string name="mmol">mmol/l</string>
<string name="dia">DIA:</string>
<string name="target_range">Målområde:</string> <string name="target_range">Målområde:</string>
<string name="prefs_range_title">Gränsvärden för visualisering</string> <string name="prefs_range_title">Gränsvärden för visualisering</string>
<string name="prefs_range_summary">Högt och lågt värde för grafen i Översikt och i klockan</string> <string name="prefs_range_summary">Högt och lågt värde för grafen i Översikt och i klockan</string>

View file

@ -333,10 +333,8 @@
<string name="button1">Düğme 1</string> <string name="button1">Düğme 1</string>
<string name="button2">Düğme 2</string> <string name="button2">Düğme 2</string>
<string name="button3">Düğme 3</string> <string name="button3">Düğme 3</string>
<string name="units">Birim:</string>
<string name="mgdl">mg/dl</string> <string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string> <string name="mmol">mmol/l</string>
<string name="dia">DIA:</string>
<string name="target_range">Hedef aralığı:</string> <string name="target_range">Hedef aralığı:</string>
<string name="prefs_range_title">Görselleştirme Aralığı</string> <string name="prefs_range_title">Görselleştirme Aralığı</string>
<string name="prefs_range_summary">Genel bakış ve akıllı saat göstergesi için yüksek ve düşük değerler</string> <string name="prefs_range_summary">Genel bakış ve akıllı saat göstergesi için yüksek ve düşük değerler</string>

View file

@ -357,10 +357,8 @@
<string name="button1">按钮1</string> <string name="button1">按钮1</string>
<string name="button2">按钮2</string> <string name="button2">按钮2</string>
<string name="button3">按钮3</string> <string name="button3">按钮3</string>
<string name="units">单位:</string>
<string name="mgdl">mg/dl</string> <string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string> <string name="mmol">mmol/l</string>
<string name="dia">DIA:</string>
<string name="target_range">目标范围:</string> <string name="target_range">目标范围:</string>
<string name="prefs_range_title">可视化范围</string> <string name="prefs_range_title">可视化范围</string>
<string name="prefs_range_summary">在智能手表上的图表上的高值和低值标记</string> <string name="prefs_range_summary">在智能手表上的图表上的高值和低值标记</string>

View file

@ -1663,5 +1663,6 @@
<string name="profilenamecontainsdot">Profile name contains dots.\nThis is not supported by NS.\nProfile is not uploaded to NS.</string> <string name="profilenamecontainsdot">Profile name contains dots.\nThis is not supported by NS.\nProfile is not uploaded to NS.</string>
<string name="low_mark_comment">Lower value of in range area (display only)</string> <string name="low_mark_comment">Lower value of in range area (display only)</string>
<string name="high_mark_comment">Higher value of in range area (display only)</string> <string name="high_mark_comment">Higher value of in range area (display only)</string>
<string name="reorder_label">Reorder</string>
</resources> </resources>

View file

@ -0,0 +1,155 @@
package info.nightscout.androidaps.db;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;
import info.AAPSMocker;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
import info.nightscout.androidaps.utils.SP;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest({MainApp.class, Logger.class, L.class, SP.class, GlucoseStatus.class})
public class BgReadingTest {
private BgReading bgReading = new BgReading();
@Test
public void valueToUnits() {
bgReading.value = 18;
assertEquals(18, bgReading.valueToUnits(Constants.MGDL) * 1, 0.01d);
assertEquals(1, bgReading.valueToUnits(Constants.MMOL) * 1, 0.01d);
}
@Test
public void directionToSymbol() {
bgReading = new BgReading();
bgReading.direction = "DoubleDown";
assertEquals("\u21ca", bgReading.directionToSymbol());
bgReading.direction = "SingleDown";
assertEquals("\u2193", bgReading.directionToSymbol());
bgReading.direction = "FortyFiveDown";
assertEquals("\u2198", bgReading.directionToSymbol());
bgReading.direction = "Flat";
assertEquals("\u2192", bgReading.directionToSymbol());
bgReading.direction = "FortyFiveUp";
assertEquals("\u2197", bgReading.directionToSymbol());
bgReading.direction = "SingleUp";
assertEquals("\u2191", bgReading.directionToSymbol());
bgReading.direction = "DoubleUp";
assertEquals("\u21c8", bgReading.directionToSymbol());
bgReading.direction = "OUT OF RANGE";
assertEquals("??", bgReading.directionToSymbol());
}
@Test
public void dateTest() {
bgReading = new BgReading();
long now = System.currentTimeMillis();
bgReading.date = now;
Date nowDate = new Date(now);
assertEquals(now, bgReading.date(now).date);
assertEquals(now, bgReading.date(nowDate).date);
}
@Test
public void valueTest() {
bgReading = new BgReading();
double valueToSet = 81; // 4.5 mmol
assertEquals(81d, bgReading.value(valueToSet).value, 0.01d);
}
@Test
public void copyFromTest() {
bgReading = new BgReading();
BgReading copy = new BgReading();
bgReading.value = 81;
long now = System.currentTimeMillis();
bgReading.date = now;
copy.date = now;
copy.copyFrom(bgReading);
assertEquals(81, copy.value, 0.1d);
assertEquals(now, copy.date);
assertEquals(bgReading.directionToSymbol(), copy.directionToSymbol());
}
@Test
public void isEqualTest() {
bgReading = new BgReading();
BgReading copy = new BgReading();
bgReading.value = 81;
long now = System.currentTimeMillis();
bgReading.date = now;
copy.date = now;
copy.copyFrom(bgReading);
assertTrue(copy.isEqual(bgReading));
assertFalse(copy.isEqual(new BgReading()));
}
@Test
public void calculateDirection() {
List<BgReading> bgReadingsList = null;
AAPSMocker.mockDatabaseHelper();
when(MainApp.getDbHelper().getAllBgreadingsDataFromTime(anyLong(),anyBoolean())).thenReturn(bgReadingsList);
assertEquals("NONE", bgReading.calculateDirection());
setReadings(72,0);
assertEquals("DoubleUp", bgReading.calculateDirection());
setReadings(76,60);
assertEquals("SingleUp", bgReading.calculateDirection());
setReadings(74,65);
assertEquals("FortyFiveUp", bgReading.calculateDirection());
setReadings(72,72);
assertEquals("Flat", bgReading.calculateDirection());
setReadings(0,72);
assertEquals("DoubleDown", bgReading.calculateDirection());
setReadings(60,76);
assertEquals("SingleDown", bgReading.calculateDirection());
setReadings(65,74);
assertEquals("FortyFiveDown", bgReading.calculateDirection());
}
@Before
public void prepareMock() {
AAPSMocker.mockMainApp();
AAPSMocker.mockApplicationContext();
AAPSMocker.mockSP();
AAPSMocker.mockL();
AAPSMocker.mockDatabaseHelper();
}
public void setReadings(int current_value, int previous_value){
BgReading now = new BgReading();
now.value = current_value;
now.date = System.currentTimeMillis();
BgReading previous = new BgReading();
previous.value = previous_value;
previous.date = System.currentTimeMillis() - ( 6 * 60 * 1000L);
List<BgReading> bgReadings = new ArrayList() {{
add(now);
add(previous);
}};
when(MainApp.getDbHelper().getAllBgreadingsDataFromTime(anyLong(),anyBoolean())).thenReturn(bgReadings);
}
}

View file

@ -1,24 +1,22 @@
package info.nightscout.androidaps.data; package info.nightscout.androidaps.data;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.SystemClock; import android.os.SystemClock;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import android.util.Log; import android.util.Log;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.GoogleApiClient;
@ -36,8 +34,11 @@ import com.google.android.gms.wearable.NodeApi;
import com.google.android.gms.wearable.Wearable; import com.google.android.gms.wearable.Wearable;
import com.google.android.gms.wearable.WearableListenerService; import com.google.android.gms.wearable.WearableListenerService;
import info.nightscout.androidaps.interaction.AAPSPreferences; import java.util.Set;
import java.util.concurrent.TimeUnit;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.interaction.AAPSPreferences;
import info.nightscout.androidaps.interaction.actions.AcceptActivity; import info.nightscout.androidaps.interaction.actions.AcceptActivity;
import info.nightscout.androidaps.interaction.actions.CPPActivity; import info.nightscout.androidaps.interaction.actions.CPPActivity;
import info.nightscout.androidaps.interaction.utils.Persistence; import info.nightscout.androidaps.interaction.utils.Persistence;
@ -79,6 +80,7 @@ public class ListenerService extends WearableListenerService implements GoogleAp
private static final String ACTION_RESEND_BULK = "com.dexdrip.stephenblack.nightwatch.RESEND_BULK_DATA"; private static final String ACTION_RESEND_BULK = "com.dexdrip.stephenblack.nightwatch.RESEND_BULK_DATA";
private static final String AAPS_NOTIFY_CHANNEL_ID = "AndroidAPS-Openloop";
GoogleApiClient googleApiClient; GoogleApiClient googleApiClient;
private long lastRequest = 0; private long lastRequest = 0;
@ -552,13 +554,29 @@ public class ListenerService extends WearableListenerService implements GoogleAp
} }
private void notifyChangeRequest(String title, String message, String actionstring) { private void notifyChangeRequest(String title, String message, String actionstring) {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = "AAPS Open Loop";
String description = "Open Loop request notiffication";//getString(R.string.channel_description);
NotificationChannel channel = new NotificationChannel(AAPS_NOTIFY_CHANNEL_ID, name, NotificationManager.IMPORTANCE_HIGH);
channel.setDescription(description);
channel.enableVibration(true);
Notification.Builder builder = // Register the channel with the system; you can't change the importance
new Notification.Builder(this); //,"AndroidAPS-Openloop"); // or other notification behaviors after this
builder.setSmallIcon(R.drawable.notif_icon) NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder builder =
new NotificationCompat.Builder(this, AAPS_NOTIFY_CHANNEL_ID);
builder = builder.setSmallIcon(R.drawable.notif_icon)
.setContentTitle(title) .setContentTitle(title)
.setContentText(message) .setContentText(message)
.setPriority(Notification.PRIORITY_HIGH); .setPriority(Notification.PRIORITY_HIGH)
.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
// Creates an explicit intent for an Activity in your app // Creates an explicit intent for an Activity in your app
Intent intent = new Intent(this, AcceptActivity.class); Intent intent = new Intent(this, AcceptActivity.class);
@ -571,8 +589,8 @@ public class ListenerService extends WearableListenerService implements GoogleAp
PendingIntent resultPendingIntent = PendingIntent resultPendingIntent =
PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(resultPendingIntent);
builder.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000}); builder = builder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager = NotificationManager mNotificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE); (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

View file

@ -65,6 +65,7 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen
public boolean lowResMode = false; public boolean lowResMode = false;
public boolean layoutSet = false; public boolean layoutSet = false;
public boolean bIsRound = false; public boolean bIsRound = false;
public boolean dividerMatchesBg = false;
public int pointSize = 2; public int pointSize = 2;
public BgGraphBuilder bgGraphBuilder; public BgGraphBuilder bgGraphBuilder;
public LineChartView chart; public LineChartView chart;
@ -480,6 +481,7 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen
} }
public void setColor() { public void setColor() {
dividerMatchesBg = sharedPrefs.getBoolean("match_divider", false);
if(lowResMode){ if(lowResMode){
setColorLowRes(); setColorLowRes();
} else if (sharedPrefs.getBoolean("dark", true)) { } else if (sharedPrefs.getBoolean("dark", true)) {

View file

@ -65,7 +65,8 @@ public class Home extends BaseWatchFace {
protected void setColorDark() { protected void setColorDark() {
mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_statusView)); mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), dividerMatchesBg ?
R.color.dark_background : R.color.dark_statusView));
mTime.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mTime)); mTime.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mTime));
mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background)); mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background));
if (rawData.sgvLevel == 1) { if (rawData.sgvLevel == 1) {
@ -83,18 +84,21 @@ public class Home extends BaseWatchFace {
} }
if (ageLevel == 1) { if (ageLevel == 1) {
mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mTimestamp1_home)); mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), dividerMatchesBg ?
R.color.dark_midColor : R.color.dark_mTimestamp1_home));
} else { } else {
mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_TimestampOld)); mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_TimestampOld));
} }
if (rawData.batteryLevel == 1) { if (rawData.batteryLevel == 1) {
mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_uploaderBattery)); mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), dividerMatchesBg ?
R.color.dark_midColor : R.color.dark_uploaderBattery));
} else { } else {
mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_uploaderBatteryEmpty)); mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_uploaderBatteryEmpty));
} }
mStatus.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mStatus_home)); mStatus.setTextColor(ContextCompat.getColor(getApplicationContext(), dividerMatchesBg ?
R.color.dark_midColor : R.color.dark_mStatus_home));
if (chart != null) { if (chart != null) {
highColor = ContextCompat.getColor(getApplicationContext(), R.color.dark_highColor); highColor = ContextCompat.getColor(getApplicationContext(), R.color.dark_highColor);
@ -131,7 +135,8 @@ public class Home extends BaseWatchFace {
protected void setColorBright() { protected void setColorBright() {
if (getCurrentWatchMode() == WatchMode.INTERACTIVE) { if (getCurrentWatchMode() == WatchMode.INTERACTIVE) {
mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_stripe_background)); mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), dividerMatchesBg ?
R.color.light_background : R.color.light_stripe_background));
mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_background)); mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_background));
if (rawData.sgvLevel == 1) { if (rawData.sgvLevel == 1) {
mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_highColor)); mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_highColor));
@ -148,17 +153,17 @@ public class Home extends BaseWatchFace {
} }
if (ageLevel == 1) { if (ageLevel == 1) {
mTimestamp.setTextColor(Color.WHITE); mTimestamp.setTextColor(dividerMatchesBg ? Color.BLACK : Color.WHITE);
} else { } else {
mTimestamp.setTextColor(Color.RED); mTimestamp.setTextColor(Color.RED);
} }
if (rawData.batteryLevel == 1) { if (rawData.batteryLevel == 1) {
mUploaderBattery.setTextColor(Color.WHITE); mUploaderBattery.setTextColor(dividerMatchesBg ? Color.BLACK : Color.WHITE);
} else { } else {
mUploaderBattery.setTextColor(Color.RED); mUploaderBattery.setTextColor(Color.RED);
} }
mStatus.setTextColor(Color.WHITE); mStatus.setTextColor(dividerMatchesBg ? Color.BLACK : Color.WHITE);
mTime.setTextColor(Color.BLACK); mTime.setTextColor(Color.BLACK);
if (chart != null) { if (chart != null) {

View file

@ -2,6 +2,7 @@ package info.nightscout.androidaps.watchfaces;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color; import android.graphics.Color;
import androidx.annotation.ColorInt;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import android.support.wearable.watchface.WatchFaceStyle; import android.support.wearable.watchface.WatchFaceStyle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -64,7 +65,14 @@ public class Home2 extends BaseWatchFace {
} }
protected void setColorDark() { protected void setColorDark() {
mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_statusView)); @ColorInt final int dividerTxtColor = dividerMatchesBg ?
ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor) : Color.BLACK;
@ColorInt final int dividerBatteryOkColor = ContextCompat.getColor(getApplicationContext(),
dividerMatchesBg ? R.color.dark_midColor : R.color.dark_uploaderBattery);
@ColorInt final int dividerBgColor = ContextCompat.getColor(getApplicationContext(),
dividerMatchesBg ? R.color.dark_background : R.color.dark_statusView);
mLinearLayout.setBackgroundColor(dividerBgColor);
mLinearLayout2.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background)); mLinearLayout2.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background));
mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background)); mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background));
mTime.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mTime.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor));
@ -96,15 +104,15 @@ public class Home2 extends BaseWatchFace {
} }
if (rawData.batteryLevel == 1) { if (rawData.batteryLevel == 1) {
mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_uploaderBattery)); mUploaderBattery.setTextColor(dividerBatteryOkColor);
} else { } else {
mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_uploaderBatteryEmpty)); mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_uploaderBatteryEmpty));
} }
mRigBattery.setTextColor(Color.BLACK); mRigBattery.setTextColor(dividerTxtColor);
mDelta.setTextColor(Color.BLACK); mDelta.setTextColor(dividerTxtColor);
mAvgDelta.setTextColor(Color.BLACK); mAvgDelta.setTextColor(dividerTxtColor);
mBasalRate.setTextColor(Color.BLACK); mBasalRate.setTextColor(dividerTxtColor);
mBgi.setTextColor(Color.BLACK); mBgi.setTextColor(dividerTxtColor);
if (loopLevel == 1) { if (loopLevel == 1) {
mLoop.setBackgroundResource(R.drawable.loop_green_25); mLoop.setBackgroundResource(R.drawable.loop_green_25);
@ -125,7 +133,12 @@ public class Home2 extends BaseWatchFace {
} }
protected void setColorLowRes() { protected void setColorLowRes() {
mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_statusView)); @ColorInt final int dividerTxtColor = dividerMatchesBg ?
ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor) : Color.BLACK;
@ColorInt final int dividerBgColor = ContextCompat.getColor(getApplicationContext(),
dividerMatchesBg ? R.color.dark_background : R.color.dark_statusView);
mLinearLayout.setBackgroundColor(dividerBgColor);
mLinearLayout2.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background)); mLinearLayout2.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background));
mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background)); mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background));
mLoop.setBackgroundResource(R.drawable.loop_grey_25); mLoop.setBackgroundResource(R.drawable.loop_grey_25);
@ -133,12 +146,12 @@ public class Home2 extends BaseWatchFace {
mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor));
mDirection.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mDirection.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor));
mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_Timestamp)); mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_Timestamp));
mDelta.setTextColor(Color.BLACK); mDelta.setTextColor(dividerTxtColor);
mAvgDelta.setTextColor(Color.BLACK); mAvgDelta.setTextColor(dividerTxtColor);
mRigBattery.setTextColor(Color.BLACK); mRigBattery.setTextColor(dividerTxtColor);
mUploaderBattery.setTextColor(Color.BLACK); mUploaderBattery.setTextColor(dividerTxtColor);
mBasalRate.setTextColor(Color.BLACK); mBasalRate.setTextColor(dividerTxtColor);
mBgi.setTextColor(Color.BLACK); mBgi.setTextColor(dividerTxtColor);
mIOB1.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mIOB1.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor));
mIOB2.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mIOB2.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor));
mCOB1.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mCOB1.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor));
@ -162,7 +175,13 @@ public class Home2 extends BaseWatchFace {
protected void setColorBright() { protected void setColorBright() {
if (getCurrentWatchMode() == WatchMode.INTERACTIVE) { if (getCurrentWatchMode() == WatchMode.INTERACTIVE) {
mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_stripe_background));
@ColorInt final int dividerTxtColor = dividerMatchesBg ? Color.BLACK :
ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor);
@ColorInt final int dividerBgColor = ContextCompat.getColor(getApplicationContext(),
dividerMatchesBg ? R.color.light_background : R.color.light_stripe_background);
mLinearLayout.setBackgroundColor(dividerBgColor);
mLinearLayout2.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_background)); mLinearLayout2.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_background));
mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_background)); mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_background));
mTime.setTextColor(Color.BLACK); mTime.setTextColor(Color.BLACK);
@ -194,15 +213,15 @@ public class Home2 extends BaseWatchFace {
} }
if (rawData.batteryLevel == 1) { if (rawData.batteryLevel == 1) {
mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mUploaderBattery.setTextColor(dividerTxtColor);
} else { } else {
mUploaderBattery.setTextColor(Color.RED); mUploaderBattery.setTextColor(Color.RED);
} }
mRigBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mRigBattery.setTextColor(dividerTxtColor);
mDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mDelta.setTextColor(dividerTxtColor);
mAvgDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mAvgDelta.setTextColor(dividerTxtColor);
mBasalRate.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mBasalRate.setTextColor(dividerTxtColor);
mBgi.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mBgi.setTextColor(dividerTxtColor);
if (loopLevel == 1) { if (loopLevel == 1) {
mLoop.setBackgroundResource(R.drawable.loop_green_25); mLoop.setBackgroundResource(R.drawable.loop_green_25);

View file

@ -49,7 +49,8 @@ public class LargeHome extends BaseWatchFace {
@Override @Override
protected void setColorDark(){ protected void setColorDark(){
mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mLinearLayout)); mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), dividerMatchesBg ?
R.color.dark_background : R.color.dark_mLinearLayout));
mTime.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mTime)); mTime.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mTime));
mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background)); mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background));
if (rawData.sgvLevel == 1) { if (rawData.sgvLevel == 1) {
@ -67,24 +68,27 @@ public class LargeHome extends BaseWatchFace {
} }
if (ageLevel == 1) { if (ageLevel == 1) {
mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mTimestamp1_home)); mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), dividerMatchesBg ?
R.color.dark_midColor : R.color.dark_mTimestamp1_home));
} else { } else {
mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_TimestampOld)); mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_TimestampOld));
} }
if (rawData.batteryLevel == 1) { if (rawData.batteryLevel == 1) {
mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_uploaderBattery)); mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), dividerMatchesBg ?
R.color.dark_midColor : R.color.dark_uploaderBattery));
} else { } else {
mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_uploaderBatteryEmpty)); mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_uploaderBatteryEmpty));
} }
mStatus.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mStatus_home)); mStatus.setTextColor(ContextCompat.getColor(getApplicationContext(), dividerMatchesBg ? R.color.dark_midColor : R.color.dark_mStatus_home));
} }
@Override @Override
protected void setColorBright() { protected void setColorBright() {
if (getCurrentWatchMode() == WatchMode.INTERACTIVE) { if (getCurrentWatchMode() == WatchMode.INTERACTIVE) {
mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_stripe_background)); mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), dividerMatchesBg ?
R.color.light_background : R.color.light_stripe_background));
mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_background)); mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_background));
if (rawData.sgvLevel == 1) { if (rawData.sgvLevel == 1) {
mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_highColor)); mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_highColor));
@ -101,21 +105,21 @@ public class LargeHome extends BaseWatchFace {
} }
if (ageLevel == 1) { if (ageLevel == 1) {
mTimestamp.setTextColor(Color.WHITE); mTimestamp.setTextColor(dividerMatchesBg ? Color.BLACK : Color.WHITE);
} else { } else {
mTimestamp.setTextColor(Color.RED); mTimestamp.setTextColor(Color.RED);
} }
if (rawData.batteryLevel == 1) { if (rawData.batteryLevel == 1) {
mUploaderBattery.setTextColor(Color.WHITE); mUploaderBattery.setTextColor(dividerMatchesBg ? Color.BLACK : Color.WHITE);
} else { } else {
mUploaderBattery.setTextColor(Color.RED); mUploaderBattery.setTextColor(Color.RED);
} }
mStatus.setTextColor(Color.WHITE); mStatus.setTextColor(dividerMatchesBg ? Color.BLACK : Color.WHITE);
mTime.setTextColor(Color.BLACK); mTime.setTextColor(Color.BLACK);
} else { } else {
mRelativeLayout.setBackgroundColor(Color.BLACK); mRelativeLayout.setBackgroundColor(Color.BLACK);
mLinearLayout.setBackgroundColor(Color.LTGRAY); mLinearLayout.setBackgroundColor(dividerMatchesBg ? Color.BLACK : Color.LTGRAY);
if (rawData.sgvLevel == 1) { if (rawData.sgvLevel == 1) {
mSgv.setTextColor(Color.YELLOW); mSgv.setTextColor(Color.YELLOW);
mDirection.setTextColor(Color.YELLOW); mDirection.setTextColor(Color.YELLOW);
@ -130,23 +134,23 @@ public class LargeHome extends BaseWatchFace {
mDelta.setTextColor(Color.RED); mDelta.setTextColor(Color.RED);
} }
mUploaderBattery.setTextColor(Color.BLACK); mUploaderBattery.setTextColor(dividerMatchesBg ? Color.WHITE : Color.BLACK);
mTimestamp.setTextColor(Color.BLACK); mTimestamp.setTextColor(dividerMatchesBg ? Color.WHITE : Color.BLACK);
mStatus.setTextColor(Color.BLACK); mStatus.setTextColor(dividerMatchesBg ? Color.WHITE : Color.BLACK);
mTime.setTextColor(Color.WHITE); mTime.setTextColor(Color.WHITE);
} }
} }
@Override @Override
protected void setColorLowRes() { protected void setColorLowRes() {
mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mLinearLayout)); mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), dividerMatchesBg ? R.color.dark_background : R.color.dark_mLinearLayout));
mTime.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mTime)); mTime.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mTime));
mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background)); mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background));
mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor));
mDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor));
mDirection.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); mDirection.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor));
mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mTimestamp1_home)); mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), dividerMatchesBg ? R.color.dark_midColor : R.color.dark_mTimestamp1_home));
mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_uploaderBattery)); mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), dividerMatchesBg ? R.color.dark_midColor : R.color.dark_uploaderBattery));
mStatus.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mStatus_home)); mStatus.setTextColor(ContextCompat.getColor(getApplicationContext(), dividerMatchesBg ? R.color.dark_midColor : R.color.dark_mStatus_home));
} }
} }

View file

@ -125,6 +125,14 @@
app:wear_iconOff="@drawable/settings_off" app:wear_iconOff="@drawable/settings_off"
app:wear_iconOn="@drawable/settings_on"/> app:wear_iconOn="@drawable/settings_on"/>
<CheckBoxPreference
android:defaultValue="false"
android:key="match_divider"
android:summary="Status bar divider background matches watchface background"
android:title="Matching divider"
app:wear_iconOff="@drawable/settings_off"
app:wear_iconOn="@drawable/settings_on"/>
<ListPreference <ListPreference
android:defaultValue="3" android:defaultValue="3"
android:entries="@array/chart_timeframe" android:entries="@array/chart_timeframe"