LocalProfile allow more profiles

This commit is contained in:
Milos Kozak 2019-09-16 15:49:45 +02:00
parent 60a113bda6
commit da447b8afe
8 changed files with 298 additions and 96 deletions

View file

@ -145,8 +145,8 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre
if (!Config.NSCLIENT) {
addPreferencesFromResource(R.xml.pref_password);
}
addPreferencesFromResource(R.xml.pref_general);
addPreferencesFromResource(R.xml.pref_age);
addPreferencesFromResource(R.xml.pref_language);
addPreferencesFromResource(R.xml.pref_overview);

View file

@ -116,6 +116,10 @@ public class ProfileFunctions {
return getProfile(System.currentTimeMillis());
}
public static String getSystemUnits() {
return SP.getString(R.string.key_units, Constants.MGDL);
}
public String getProfileUnits() {
Profile profile = getProfile();
return profile != null ? profile.getUnits() : Constants.MGDL;

View file

@ -7,19 +7,21 @@ import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ArrayAdapter
import androidx.fragment.app.Fragment
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.R
import info.nightscout.androidaps.data.Profile
import info.nightscout.androidaps.events.EventInitializationChanged
import info.nightscout.androidaps.plugins.bus.RxBus
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions
import info.nightscout.androidaps.plugins.general.careportal.CareportalFragment
import info.nightscout.androidaps.plugins.general.careportal.Dialogs.NewNSTreatmentDialog
import info.nightscout.androidaps.plugins.insulin.InsulinOrefBasePlugin.MIN_DIA
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.SafeParse
import info.nightscout.androidaps.utils.TimeListEdit
import info.nightscout.androidaps.utils.*
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import kotlinx.android.synthetic.main.localprofile_fragment.*
@ -29,6 +31,7 @@ class LocalProfileFragment : Fragment() {
private var disposable: CompositeDisposable = CompositeDisposable()
private var basalView: TimeListEdit? = null
private var spinner: SpinnerHelper? = null
private val save = Runnable {
doEdit()
@ -39,7 +42,7 @@ class LocalProfileFragment : Fragment() {
override fun afterTextChanged(s: Editable) {}
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
LocalProfilePlugin.dia = SafeParse.stringToDouble(localprofile_dia.text.toString())
LocalProfilePlugin.currentProfile().dia = SafeParse.stringToDouble(localprofile_dia.text.toString())
doEdit()
}
}
@ -57,35 +60,71 @@ class LocalProfileFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
build()
}
fun build() {
val pumpDescription = ConfigBuilderPlugin.getPlugin().activePump?.pumpDescription ?: return
val units = ProfileFunctions.getSystemUnits()
localprofile_dia.setParams(LocalProfilePlugin.dia, MIN_DIA, 12.0, 0.1, DecimalFormat("0.0"), false, localprofile_save, textWatch)
TimeListEdit(context, view, R.id.localprofile_ic, MainApp.gs(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.ic, null, 0.5, 50.0, 0.1, DecimalFormat("0.0"), save)
TimeListEdit(context, view, R.id.localprofile_isf, MainApp.gs(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.isf, null, 0.5, 500.0, 0.1, DecimalFormat("0.0"), save)
basalView = TimeListEdit(context, view, R.id.localprofile_basal, MainApp.gs(R.string.nsprofileview_basal_label) + ": " + sumLabel(), LocalProfilePlugin.basal, null, pumpDescription.basalMinimumRate, 10.0, 0.01, DecimalFormat("0.00"), save)
TimeListEdit(context, view, R.id.localprofile_target, MainApp.gs(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.targetLow, LocalProfilePlugin.targetHigh, 3.0, 200.0, 0.1, DecimalFormat("0.0"), save)
if (!pumpDescription.isTempBasalCapable) {
localprofile_basal.visibility = View.GONE
localprofile_name.setText(LocalProfilePlugin.currentProfile().name)
localprofile_dia.setParams(LocalProfilePlugin.currentProfile().dia, HardLimits.MINDIA, HardLimits.MAXDIA, 0.1, DecimalFormat("0.0"), false, localprofile_save, textWatch)
TimeListEdit(context, view, R.id.localprofile_ic, MainApp.gs(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.currentProfile().ic, null, HardLimits.MINIC, HardLimits.MAXIC, 0.1, DecimalFormat("0.0"), save)
basalView = TimeListEdit(context, view, R.id.localprofile_basal, MainApp.gs(R.string.nsprofileview_basal_label) + ": " + sumLabel(), LocalProfilePlugin.currentProfile().basal, null, pumpDescription.basalMinimumRate, 10.0, 0.01, DecimalFormat("0.00"), save)
if (units == Constants.MGDL) {
TimeListEdit(context, view, R.id.localprofile_isf, MainApp.gs(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.currentProfile().isf, null, HardLimits.MINISF, HardLimits.MAXISF, 1.0, DecimalFormat("0"), save)
TimeListEdit(context, view, R.id.localprofile_target, MainApp.gs(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.currentProfile().targetLow, LocalProfilePlugin.currentProfile().targetHigh, HardLimits.VERY_HARD_LIMIT_TARGET_BG[0].toDouble(), HardLimits.VERY_HARD_LIMIT_TARGET_BG[1].toDouble(), 1.0, DecimalFormat("0"), save)
} else {
TimeListEdit(context, view, R.id.localprofile_isf, MainApp.gs(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.currentProfile().isf, null, Profile.fromMgdlToUnits(HardLimits.MINISF, Constants.MMOL), Profile.fromMgdlToUnits(HardLimits.MAXISF, Constants.MMOL), 0.1, DecimalFormat("0.0"), save)
TimeListEdit(context, view, R.id.localprofile_target, MainApp.gs(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.currentProfile().targetLow, LocalProfilePlugin.currentProfile().targetHigh, Profile.fromMgdlToUnits(HardLimits.VERY_HARD_LIMIT_TARGET_BG[0].toDouble(), Constants.MMOL), Profile.fromMgdlToUnits(HardLimits.VERY_HARD_LIMIT_TARGET_BG[1].toDouble(), Constants.MMOL), 0.1, DecimalFormat("0.0"), save)
}
localprofile_mgdl.isChecked = LocalProfilePlugin.mgdl
localprofile_mmol.isChecked = LocalProfilePlugin.mmol
// Spinner
spinner = SpinnerHelper(view?.findViewById(R.id.localprofile_spinner))
val profileList: ArrayList<CharSequence> = LocalProfilePlugin.profile?.profileList
?: ArrayList()
context?.let { context ->
val adapter = ArrayAdapter(context, R.layout.spinner_centered, profileList)
spinner?.adapter = adapter
spinner?.setSelection(LocalProfilePlugin.currentProfileIndex)
} ?: return
spinner?.setOnItemSelectedListener(object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(parent: AdapterView<*>?) {
}
localprofile_mgdl.setOnClickListener {
LocalProfilePlugin.mgdl = localprofile_mgdl.isChecked
LocalProfilePlugin.mmol = !LocalProfilePlugin.mgdl
localprofile_mmol.isChecked = LocalProfilePlugin.mmol
doEdit()
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
if (LocalProfilePlugin.isEdited) {
context?.let { context ->
OKDialog.show(context, MainApp.gs(R.string.confirmation), MainApp.gs(R.string.doyouwantswitchprofile)) {
LocalProfilePlugin.currentProfileIndex = position
build()
}
}
} else {
LocalProfilePlugin.currentProfileIndex = position
build()
}
}
})
localprofile_profile_add.setOnClickListener {
LocalProfilePlugin.addNewProfile()
build()
}
localprofile_mmol.setOnClickListener {
LocalProfilePlugin.mmol = localprofile_mmol.isChecked
LocalProfilePlugin.mgdl = !LocalProfilePlugin.mmol
localprofile_mgdl.isChecked = LocalProfilePlugin.mgdl
doEdit()
localprofile_profile_remove.setOnClickListener {
LocalProfilePlugin.removeCurrentProfile()
build()
}
// this is probably not possible because it leads to invalid profile
// if (!pumpDescription.isTempBasalCapable) localprofile_basal.visibility = View.GONE
localprofile_mgdl.isChecked = LocalProfilePlugin.currentProfile().mgdl
localprofile_mmol.isChecked = !LocalProfilePlugin.currentProfile().mgdl
localprofile_mgdl.isEnabled = false
localprofile_mmol.isEnabled = false
localprofile_profileswitch.setOnClickListener {
val newDialog = NewNSTreatmentDialog()
val profileSwitch = CareportalFragment.PROFILESWITCHDIRECT
@ -96,13 +135,13 @@ class LocalProfileFragment : Fragment() {
localprofile_reset.setOnClickListener {
LocalProfilePlugin.loadSettings()
localprofile_mgdl.isChecked = LocalProfilePlugin.mgdl
localprofile_mmol.isChecked = LocalProfilePlugin.mmol
localprofile_dia.setParams(LocalProfilePlugin.dia, MIN_DIA, 12.0, 0.1, DecimalFormat("0.0"), false, localprofile_save, textWatch)
TimeListEdit(context, view, R.id.localprofile_ic, MainApp.gs(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.ic, null, 0.5, 50.0, 0.1, DecimalFormat("0.0"), save)
TimeListEdit(context, view, R.id.localprofile_isf, MainApp.gs(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.isf, null, 0.5, 500.0, 0.1, DecimalFormat("0.0"), save)
basalView = TimeListEdit(context, view, R.id.localprofile_basal, MainApp.gs(R.string.nsprofileview_basal_label) + ": " + sumLabel(), LocalProfilePlugin.basal, null, pumpDescription.basalMinimumRate, 10.0, 0.01, DecimalFormat("0.00"), save)
TimeListEdit(context, view, R.id.localprofile_target, MainApp.gs(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.targetLow, LocalProfilePlugin.targetHigh, 3.0, 200.0, 0.1, DecimalFormat("0.0"), save)
localprofile_mgdl.isChecked = LocalProfilePlugin.currentProfile().mgdl
localprofile_mmol.isChecked = !LocalProfilePlugin.currentProfile().mgdl
localprofile_dia.setParams(LocalProfilePlugin.currentProfile().dia, MIN_DIA, 12.0, 0.1, DecimalFormat("0.0"), false, localprofile_save, textWatch)
TimeListEdit(context, view, R.id.localprofile_ic, MainApp.gs(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.currentProfile().ic, null, 0.5, 50.0, 0.1, DecimalFormat("0.0"), save)
TimeListEdit(context, view, R.id.localprofile_isf, MainApp.gs(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.currentProfile().isf, null, 0.5, 500.0, 0.1, DecimalFormat("0.0"), save)
basalView = TimeListEdit(context, view, R.id.localprofile_basal, MainApp.gs(R.string.nsprofileview_basal_label) + ": " + sumLabel(), LocalProfilePlugin.currentProfile().basal, null, pumpDescription.basalMinimumRate, 10.0, 0.01, DecimalFormat("0.00"), save)
TimeListEdit(context, view, R.id.localprofile_target, MainApp.gs(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.currentProfile().targetLow, LocalProfilePlugin.currentProfile().targetHigh, 3.0, 200.0, 0.1, DecimalFormat("0.0"), save)
updateGUI()
}

View file

@ -11,16 +11,17 @@ import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.androidaps.interfaces.ProfileInterface
import info.nightscout.androidaps.logging.L
import info.nightscout.androidaps.plugins.bus.RxBus
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.androidaps.utils.SP
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject
import org.slf4j.LoggerFactory
import java.util.*
import kotlin.collections.ArrayList
/**
* Created by mike on 05.08.2016.
*/
object LocalProfilePlugin : PluginBase(PluginDescription()
.mainType(PluginType.PROFILE)
.fragmentClass(LocalProfileFragment::class.java.name)
@ -36,15 +37,28 @@ object LocalProfilePlugin : PluginBase(PluginDescription()
private const val DEFAULTARRAY = "[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":0}]"
class SingleProfile {
internal var name: String? = null
internal var mgdl: Boolean = false
internal var dia: Double = Constants.defaultDIA
internal var ic: JSONArray? = null
internal var isf: JSONArray? = null
internal var basal: JSONArray? = null
internal var targetLow: JSONArray? = null
internal var targetHigh: JSONArray? = null
}
var isEdited: Boolean = false
internal var mgdl: Boolean = false
internal var mmol: Boolean = false
internal var dia: Double? = null
internal var ic: JSONArray? = null
internal var isf: JSONArray? = null
internal var basal: JSONArray? = null
internal var targetLow: JSONArray? = null
internal var targetHigh: JSONArray? = null
var profiles: ArrayList<SingleProfile> = ArrayList()
internal var numOfProfiles = 0
internal var currentProfileIndex = 0
init {
loadSettings()
}
fun currentProfile() = profiles[currentProfileIndex]
@Synchronized
fun isValidEditState(): Boolean {
@ -52,20 +66,22 @@ object LocalProfilePlugin : PluginBase(PluginDescription()
?: false
}
init {
loadSettings()
}
@Synchronized
fun storeSettings() {
SP.putBoolean(LOCAL_PROFILE + "mmol", mmol)
SP.putBoolean(LOCAL_PROFILE + "mgdl", mgdl)
SP.putString(LOCAL_PROFILE + "dia", dia.toString())
SP.putString(LOCAL_PROFILE + "ic", ic.toString())
SP.putString(LOCAL_PROFILE + "isf", isf.toString())
SP.putString(LOCAL_PROFILE + "basal", basal.toString())
SP.putString(LOCAL_PROFILE + "targetlow", targetLow.toString())
SP.putString(LOCAL_PROFILE + "targethigh", targetHigh.toString())
for (i in 0 until numOfProfiles) {
profiles[i].run {
val LOCAL_PROFILE_NUMBERED = LOCAL_PROFILE + "_" + i + "_"
SP.putString(LOCAL_PROFILE_NUMBERED + "name", name)
SP.putBoolean(LOCAL_PROFILE_NUMBERED + "mgdl", mgdl)
SP.putDouble(LOCAL_PROFILE_NUMBERED + "dia", dia)
SP.putString(LOCAL_PROFILE_NUMBERED + "ic", ic.toString())
SP.putString(LOCAL_PROFILE_NUMBERED + "isf", isf.toString())
SP.putString(LOCAL_PROFILE_NUMBERED + "basal", basal.toString())
SP.putString(LOCAL_PROFILE_NUMBERED + "targetlow", targetLow.toString())
SP.putString(LOCAL_PROFILE_NUMBERED + "targethigh", targetHigh.toString())
}
}
SP.putInt(LOCAL_PROFILE + "_profiles", numOfProfiles)
createAndStoreConvertedProfile()
isEdited = false
@ -76,61 +92,146 @@ object LocalProfilePlugin : PluginBase(PluginDescription()
@Synchronized
fun loadSettings() {
if (SP.contains(LOCAL_PROFILE + "mgdl")) {
doConversion()
return
}
numOfProfiles = SP.getInt(LOCAL_PROFILE + "_profiles", 0)
profiles.clear()
numOfProfiles = Math.max(numOfProfiles, 1) // create at least one default profile if none exists
for (i in 0 until numOfProfiles) {
val p = SingleProfile()
val LOCAL_PROFILE_NUMBERED = LOCAL_PROFILE + "_" + i + "_"
p.name = SP.getString(LOCAL_PROFILE_NUMBERED + "name", LOCAL_PROFILE + i)
p.mgdl = SP.getBoolean(LOCAL_PROFILE_NUMBERED + "mgdl", false)
p.dia = SP.getDouble(LOCAL_PROFILE_NUMBERED + "dia", Constants.defaultDIA)
try {
p.ic = JSONArray(SP.getString(LOCAL_PROFILE_NUMBERED + "ic", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
p.ic = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
log.error("Exception", e1)
}
try {
p.isf = JSONArray(SP.getString(LOCAL_PROFILE_NUMBERED + "isf", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
p.isf = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
log.error("Exception", e1)
}
try {
p.basal = JSONArray(SP.getString(LOCAL_PROFILE_NUMBERED + "basal", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
p.basal = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
log.error("Exception", e1)
}
try {
p.targetLow = JSONArray(SP.getString(LOCAL_PROFILE_NUMBERED + "targetlow", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
p.targetLow = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
log.error("Exception", e1)
}
try {
p.targetHigh = JSONArray(SP.getString(LOCAL_PROFILE_NUMBERED + "targethigh", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
p.targetHigh = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
log.error("Exception", e1)
}
profiles.add(p)
}
isEdited = false
createAndStoreConvertedProfile()
}
@Synchronized
private fun doConversion() { // conversion from 2.3 to 2.4 format
if (L.isEnabled(L.PROFILE))
log.debug("Loading stored settings")
val p = SingleProfile()
mgdl = SP.getBoolean(LOCAL_PROFILE + "mgdl", false)
mmol = SP.getBoolean(LOCAL_PROFILE + "mmol", true)
dia = SP.getDouble(LOCAL_PROFILE + "dia", Constants.defaultDIA)
p.mgdl = SP.getBoolean(LOCAL_PROFILE + "mgdl", ProfileFunctions.getSystemUnits() == Constants.MGDL)
p.dia = SP.getDouble(LOCAL_PROFILE + "dia", Constants.defaultDIA)
try {
ic = JSONArray(SP.getString(LOCAL_PROFILE + "ic", DEFAULTARRAY))
p.ic = JSONArray(SP.getString(LOCAL_PROFILE + "ic", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
ic = JSONArray(DEFAULTARRAY)
p.ic = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
}
try {
isf = JSONArray(SP.getString(LOCAL_PROFILE + "isf", DEFAULTARRAY))
p.isf = JSONArray(SP.getString(LOCAL_PROFILE + "isf", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
isf = JSONArray(DEFAULTARRAY)
p.isf = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
}
try {
basal = JSONArray(SP.getString(LOCAL_PROFILE + "basal", DEFAULTARRAY))
p.basal = JSONArray(SP.getString(LOCAL_PROFILE + "basal", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
basal = JSONArray(DEFAULTARRAY)
p.basal = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
}
try {
targetLow = JSONArray(SP.getString(LOCAL_PROFILE + "targetlow", DEFAULTARRAY))
p.targetLow = JSONArray(SP.getString(LOCAL_PROFILE + "targetlow", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
targetLow = JSONArray(DEFAULTARRAY)
p.targetLow = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
}
try {
targetHigh = JSONArray(SP.getString(LOCAL_PROFILE + "targethigh", DEFAULTARRAY))
p.targetHigh = JSONArray(SP.getString(LOCAL_PROFILE + "targethigh", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
targetHigh = JSONArray(DEFAULTARRAY)
p.targetHigh = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
}
p.name = LOCAL_PROFILE
SP.remove(LOCAL_PROFILE + "mgdl")
SP.remove(LOCAL_PROFILE + "mmol")
SP.remove(LOCAL_PROFILE + "dia")
SP.remove(LOCAL_PROFILE + "ic")
SP.remove(LOCAL_PROFILE + "isf")
SP.remove(LOCAL_PROFILE + "basal")
SP.remove(LOCAL_PROFILE + "targetlow")
SP.remove(LOCAL_PROFILE + "targethigh")
currentProfileIndex = 0
numOfProfiles = 1
profiles.clear()
profiles.add(p)
storeSettings()
isEdited = false
createAndStoreConvertedProfile()
@ -178,22 +279,61 @@ object LocalProfilePlugin : PluginBase(PluginDescription()
rawProfile = createProfileStore()
}
fun addNewProfile() {
var free = 0
for (i in 1..10000) {
if (rawProfile?.getSpecificProfile(LOCAL_PROFILE + i) == null) {
free = i;
break
}
}
val p = SingleProfile()
p.name = LOCAL_PROFILE + free
p.mgdl = ProfileFunctions.getSystemUnits() == Constants.MGDL
p.dia = Constants.defaultDIA
p.ic = JSONArray(DEFAULTARRAY)
p.isf = JSONArray(DEFAULTARRAY)
p.basal = JSONArray(DEFAULTARRAY)
p.targetLow = JSONArray(DEFAULTARRAY)
p.targetHigh = JSONArray(DEFAULTARRAY)
profiles.add(p)
currentProfileIndex = profiles.size - 1
numOfProfiles++
createAndStoreConvertedProfile()
storeSettings()
}
fun removeCurrentProfile() {
profiles.removeAt(currentProfileIndex)
numOfProfiles--
if (profiles.size == 0) addNewProfile()
currentProfileIndex = 0
createAndStoreConvertedProfile()
storeSettings()
}
fun createProfileStore(): ProfileStore {
val json = JSONObject()
val store = JSONObject()
val profile = JSONObject()
try {
json.put("defaultProfile", LOCAL_PROFILE)
for (i in 0 until numOfProfiles) {
profiles[i].run {
val profile = JSONObject()
profile.put("dia", dia)
profile.put("carbratio", ic)
profile.put("sens", isf)
profile.put("basal", basal)
profile.put("target_low", targetLow)
profile.put("target_high", targetHigh)
profile.put("units", if (mgdl) Constants.MGDL else Constants.MMOL)
profile.put("timezone", TimeZone.getDefault().id)
store.put(name, profile)
}
}
json.put("defaultProfile", currentProfile().name)
json.put("startDate", DateUtil.toISOAsUTC(DateUtil.now()))
json.put("store", store)
profile.put("dia", dia)
profile.put("carbratio", ic)
profile.put("sens", isf)
profile.put("basal", basal)
profile.put("target_low", targetLow)
profile.put("target_high", targetHigh)
profile.put("units", if (mgdl) Constants.MGDL else Constants.MMOL)
store.put(LOCAL_PROFILE, profile)
} catch (e: JSONException) {
log.error("Unhandled exception", e)
}
@ -202,11 +342,11 @@ object LocalProfilePlugin : PluginBase(PluginDescription()
}
override fun getProfile(): ProfileStore? {
return if (rawProfile?.defaultProfile?.isValid(MainApp.gs(R.string.localprofile)) != true) null else rawProfile
return rawProfile
}
override fun getUnits(): String {
return if (mgdl) Constants.MGDL else Constants.MMOL
return if (currentProfile().mgdl) Constants.MGDL else Constants.MMOL
}
override fun getProfileName(): String {

View file

@ -35,32 +35,29 @@
android:textAppearance="?android:attr/textAppearanceMedium" />
<Spinner
android:id="@+id/spinner"
android:id="@+id/localprofile_spinner"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="10dp"
android:layout_weight="1" />
<ImageView
android:id="@+id/localprofile_profile_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="15dp"
android:scaleX="2"
android:scaleY="2"
android:src="@drawable/add"
android:contentDescription="@string/addnew" />
<ImageView
android:id="@+id/localprofile_profile_remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="15dp"
android:layout_marginEnd="10dp"
android:scaleX="2"
android:scaleY="2"
android:src="@drawable/remove"
android:contentDescription="@string/remove_label"/>

View file

@ -10,6 +10,15 @@
<item>open</item>
</string-array>
<string-array name="unitsArray">
<item>mg/dL</item>
<item>mmol/L</item>
</string-array>
<string-array name="unitsValues" translatable="false">
<item>mg/dl</item>
<item>mmol</item>
</string-array>
<string-array name="languagesArray">
<item>@string/en_lang</item>
<item>@string/af_lang</item>

View file

@ -1606,5 +1606,8 @@
<string name="unit_minute_short">min</string>
<string name="profile_name">Profile name:</string>
<string name="selected_profile">Selected:</string>
<string name="unitsnosemicolon">Units</string>
<string name="key_units" translatable="false">units</string>
<string name="doyouwantswitchprofile">Do you want to switch profile and discard changes made to current profile?</string>
</resources>

View file

@ -1,13 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="@string/configbuilder_general">
<ListPreference
android:title="@string/unitsnosemicolon"
android:defaultValue="mg/dl"
android:entries="@array/unitsArray"
android:entryValues="@array/unitsValues"
android:key="@string/key_units" />
<ListPreference
android:title="@string/language"
android:defaultValue="en"
android:entries="@array/languagesArray"
android:entryValues="@array/languagesValues"
android:key="@string/key_language" />
</PreferenceCategory>
</PreferenceScreen>