LocalProfilePlugin -> kotlin

This commit is contained in:
Milos Kozak 2019-09-15 18:19:36 +02:00
parent c8c830f51c
commit cf506a5439
5 changed files with 249 additions and 264 deletions

View file

@ -189,7 +189,7 @@ public class MainApp extends Application {
if (Config.APS) pluginsList.add(OpenAPSSMBPlugin.getPlugin());
pluginsList.add(NSProfilePlugin.getPlugin());
if (Config.OTHERPROFILES) pluginsList.add(SimpleProfilePlugin.getPlugin());
if (Config.OTHERPROFILES) pluginsList.add(LocalProfilePlugin.getPlugin());
if (Config.OTHERPROFILES) pluginsList.add(LocalProfilePlugin.INSTANCE);
pluginsList.add(TreatmentsPlugin.getPlugin());
if (Config.SAFETY) pluginsList.add(SafetyPlugin.getPlugin());
if (Config.SAFETY) pluginsList.add(VersionCheckerPlugin.INSTANCE);

View file

@ -11,7 +11,6 @@ import androidx.fragment.app.Fragment
import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.R
import info.nightscout.androidaps.events.EventInitializationChanged
import info.nightscout.androidaps.interfaces.PumpDescription
import info.nightscout.androidaps.plugins.bus.RxBus
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin
import info.nightscout.androidaps.plugins.general.careportal.CareportalFragment
@ -40,13 +39,13 @@ 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.getPlugin().dia = SafeParse.stringToDouble(localprofile_dia.text.toString())
LocalProfilePlugin.dia = SafeParse.stringToDouble(localprofile_dia.text.toString())
doEdit()
}
}
private fun sumLabel(): String {
val profile = LocalProfilePlugin.getPlugin().createProfileStore().defaultProfile
val profile = LocalProfilePlugin.createProfileStore().defaultProfile
val sum = profile?.baseBasalSum() ?: 0.0
return "" + DecimalFormatter.to2Decimal(sum) + MainApp.gs(R.string.insulin_unit_shortname)
}
@ -60,30 +59,30 @@ class LocalProfileFragment : Fragment() {
super.onViewCreated(view, savedInstanceState)
val pumpDescription = ConfigBuilderPlugin.getPlugin().activePump?.pumpDescription ?: return
localprofile_dia.setParams(LocalProfilePlugin.getPlugin().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.getPlugin().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.getPlugin().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.getPlugin().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.getPlugin().targetLow, LocalProfilePlugin.getPlugin().targetHigh, 3.0, 200.0, 0.1, DecimalFormat("0.0"), save)
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_mgdl.isChecked = LocalProfilePlugin.getPlugin().mgdl
localprofile_mmol.isChecked = LocalProfilePlugin.getPlugin().mmol
localprofile_mgdl.isChecked = LocalProfilePlugin.mgdl
localprofile_mmol.isChecked = LocalProfilePlugin.mmol
localprofile_mgdl.setOnClickListener {
LocalProfilePlugin.getPlugin().mgdl = localprofile_mgdl.isChecked
LocalProfilePlugin.getPlugin().mmol = !LocalProfilePlugin.getPlugin().mgdl
localprofile_mmol.isChecked = LocalProfilePlugin.getPlugin().mmol
LocalProfilePlugin.mgdl = localprofile_mgdl.isChecked
LocalProfilePlugin.mmol = !LocalProfilePlugin.mgdl
localprofile_mmol.isChecked = LocalProfilePlugin.mmol
doEdit()
}
localprofile_mmol.setOnClickListener {
LocalProfilePlugin.getPlugin().mmol = localprofile_mmol.isChecked
LocalProfilePlugin.getPlugin().mgdl = !LocalProfilePlugin.getPlugin().mmol
localprofile_mgdl.isChecked = LocalProfilePlugin.getPlugin().mgdl
LocalProfilePlugin.mmol = localprofile_mmol.isChecked
LocalProfilePlugin.mgdl = !LocalProfilePlugin.mmol
localprofile_mgdl.isChecked = LocalProfilePlugin.mgdl
doEdit()
}
@ -96,22 +95,22 @@ class LocalProfileFragment : Fragment() {
}
localprofile_reset.setOnClickListener {
LocalProfilePlugin.getPlugin().loadSettings()
localprofile_mgdl.isChecked = LocalProfilePlugin.getPlugin().mgdl
localprofile_mmol.isChecked = LocalProfilePlugin.getPlugin().mmol
localprofile_dia.setParams(LocalProfilePlugin.getPlugin().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.getPlugin().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.getPlugin().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.getPlugin().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.getPlugin().targetLow, LocalProfilePlugin.getPlugin().targetHigh, 3.0, 200.0, 0.1, DecimalFormat("0.0"), save)
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)
updateGUI()
}
localprofile_save.setOnClickListener {
if (!LocalProfilePlugin.getPlugin().isValidEditState) {
if (!LocalProfilePlugin.isValidEditState()) {
return@setOnClickListener //Should not happen as saveButton should not be visible if not valid
}
LocalProfilePlugin.getPlugin().storeSettings()
LocalProfilePlugin.storeSettings()
updateGUI()
}
updateGUI()
@ -134,14 +133,14 @@ class LocalProfileFragment : Fragment() {
}
fun doEdit() {
LocalProfilePlugin.getPlugin().isEdited = true
LocalProfilePlugin.isEdited = true
updateGUI()
}
fun updateGUI() {
if (invalidprofile == null) return
val isValid = LocalProfilePlugin.getPlugin().isValidEditState
val isEdited = LocalProfilePlugin.getPlugin().isEdited
val isValid = LocalProfilePlugin.isValidEditState()
val isEdited = LocalProfilePlugin.isEdited
if (isValid) {
invalidprofile.visibility = View.GONE //show invalid profile
@ -159,7 +158,7 @@ class LocalProfileFragment : Fragment() {
localprofile_save.visibility = View.GONE //don't save an invalid profile
}
//Show reset button iff data was edited
//Show reset button if data was edited
if (isEdited) {
localprofile_reset.visibility = View.VISIBLE
} else {

View file

@ -1,231 +0,0 @@
package info.nightscout.androidaps.plugins.profile.local;
import androidx.annotation.NonNull;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.ProfileStore;
import info.nightscout.androidaps.events.EventProfileStoreChanged;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
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.utils.DecimalFormatter;
import info.nightscout.androidaps.utils.SP;
/**
* Created by mike on 05.08.2016.
*/
public class LocalProfilePlugin extends PluginBase implements ProfileInterface {
public static final String LOCAL_PROFILE = "LocalProfile";
private static Logger log = LoggerFactory.getLogger(L.PROFILE);
private static LocalProfilePlugin localProfilePlugin;
public static LocalProfilePlugin getPlugin() {
if (localProfilePlugin == null)
localProfilePlugin = new LocalProfilePlugin();
return localProfilePlugin;
}
private ProfileStore convertedProfile = null;
private static final String DEFAULTARRAY = "[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":0}]";
public boolean isEdited() {
return edited;
}
public void setEdited(boolean edited) {
this.edited = edited;
}
boolean edited;
boolean mgdl;
boolean mmol;
Double dia;
JSONArray ic;
JSONArray isf;
JSONArray basal;
JSONArray targetLow;
JSONArray targetHigh;
public LocalProfilePlugin() {
super(new PluginDescription()
.mainType(PluginType.PROFILE)
.fragmentClass(LocalProfileFragment.class.getName())
.pluginName(R.string.localprofile)
.shortName(R.string.localprofile_shortname)
.description(R.string.description_profile_local)
);
loadSettings();
}
public synchronized void 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());
createAndStoreConvertedProfile();
edited = false;
if (L.isEnabled(L.PROFILE))
log.debug("Storing settings: " + getRawProfile().getData().toString());
RxBus.INSTANCE.send(new EventProfileStoreChanged());
}
public synchronized void loadSettings() {
if (L.isEnabled(L.PROFILE))
log.debug("Loading stored settings");
mgdl = SP.getBoolean(LOCAL_PROFILE + "mgdl", false);
mmol = SP.getBoolean(LOCAL_PROFILE + "mmol", true);
dia = SP.getDouble(LOCAL_PROFILE + "dia", Constants.defaultDIA);
try {
ic = new JSONArray(SP.getString(LOCAL_PROFILE + "ic", DEFAULTARRAY));
} catch (JSONException e1) {
try {
ic = new JSONArray(DEFAULTARRAY);
} catch (JSONException ignored) {
}
}
try {
isf = new JSONArray(SP.getString(LOCAL_PROFILE + "isf", DEFAULTARRAY));
} catch (JSONException e1) {
try {
isf = new JSONArray(DEFAULTARRAY);
} catch (JSONException ignored) {
}
}
try {
basal = new JSONArray(SP.getString(LOCAL_PROFILE + "basal", DEFAULTARRAY));
} catch (JSONException e1) {
try {
basal = new JSONArray(DEFAULTARRAY);
} catch (JSONException ignored) {
}
}
try {
targetLow = new JSONArray(SP.getString(LOCAL_PROFILE + "targetlow", DEFAULTARRAY));
} catch (JSONException e1) {
try {
targetLow = new JSONArray(DEFAULTARRAY);
} catch (JSONException ignored) {
}
}
try {
targetHigh = new JSONArray(SP.getString(LOCAL_PROFILE + "targethigh", DEFAULTARRAY));
} catch (JSONException e1) {
try {
targetHigh = new JSONArray(DEFAULTARRAY);
} catch (JSONException ignored) {
}
}
edited = false;
createAndStoreConvertedProfile();
}
/*
{
"_id": "576264a12771b7500d7ad184",
"startDate": "2016-06-16T08:35:00.000Z",
"defaultProfile": "Default",
"store": {
"Default": {
"dia": "3",
"carbratio": [{
"time": "00:00",
"value": "30"
}],
"carbs_hr": "20",
"delay": "20",
"sens": [{
"time": "00:00",
"value": "100"
}],
"timezone": "UTC",
"basal": [{
"time": "00:00",
"value": "0.1"
}],
"target_low": [{
"time": "00:00",
"value": "0"
}],
"target_high": [{
"time": "00:00",
"value": "0"
}],
"startDate": "1970-01-01T00:00:00.000Z",
"units": "mmol"
}
},
"created_at": "2016-06-16T08:34:41.256Z"
}
*/
private void createAndStoreConvertedProfile() {
convertedProfile = createProfileStore();
}
public synchronized boolean isValidEditState() {
return createProfileStore().getDefaultProfile().isValid(MainApp.gs(R.string.localprofile), false);
}
@NonNull
public ProfileStore createProfileStore() {
JSONObject json = new JSONObject();
JSONObject store = new JSONObject();
JSONObject profile = new JSONObject();
try {
json.put("defaultProfile", LOCAL_PROFILE);
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", mgdl ? Constants.MGDL : Constants.MMOL);
store.put(LOCAL_PROFILE, profile);
} catch (JSONException e) {
log.error("Unhandled exception", e);
}
return new ProfileStore(json);
}
@Override
public ProfileStore getProfile() {
if (!convertedProfile.getDefaultProfile().isValid(MainApp.gs(R.string.localprofile)))
return null;
return convertedProfile;
}
public ProfileStore getRawProfile() {
return convertedProfile;
}
@Override
public String getUnits() {
return mgdl ? Constants.MGDL : Constants.MMOL;
}
@Override
public String getProfileName() {
return DecimalFormatter.to2Decimal(convertedProfile.getDefaultProfile().percentageBasalSum()) + "U ";
}
}

View file

@ -0,0 +1,217 @@
package info.nightscout.androidaps.plugins.profile.local
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.R
import info.nightscout.androidaps.data.ProfileStore
import info.nightscout.androidaps.events.EventProfileStoreChanged
import info.nightscout.androidaps.interfaces.PluginBase
import info.nightscout.androidaps.interfaces.PluginDescription
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.utils.DecimalFormatter
import info.nightscout.androidaps.utils.SP
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject
import org.slf4j.LoggerFactory
/**
* Created by mike on 05.08.2016.
*/
object LocalProfilePlugin : PluginBase(PluginDescription()
.mainType(PluginType.PROFILE)
.fragmentClass(LocalProfileFragment::class.java.name)
.pluginName(R.string.localprofile)
.shortName(R.string.localprofile_shortname)
.description(R.string.description_profile_local)), ProfileInterface {
private val log = LoggerFactory.getLogger(L.PROFILE)
private var rawProfile: ProfileStore? = null
const val LOCAL_PROFILE = "LocalProfile"
private const val DEFAULTARRAY = "[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":0}]"
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
@Synchronized
fun isValidEditState(): Boolean {
return createProfileStore().defaultProfile?.isValid(MainApp.gs(R.string.localprofile), false)
?: 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())
createAndStoreConvertedProfile()
isEdited = false
if (L.isEnabled(L.PROFILE))
log.debug("Storing settings: " + rawProfile?.data.toString())
RxBus.send(EventProfileStoreChanged())
}
@Synchronized
fun loadSettings() {
if (L.isEnabled(L.PROFILE))
log.debug("Loading stored settings")
mgdl = SP.getBoolean(LOCAL_PROFILE + "mgdl", false)
mmol = SP.getBoolean(LOCAL_PROFILE + "mmol", true)
dia = SP.getDouble(LOCAL_PROFILE + "dia", Constants.defaultDIA)
try {
ic = JSONArray(SP.getString(LOCAL_PROFILE + "ic", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
ic = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
}
try {
isf = JSONArray(SP.getString(LOCAL_PROFILE + "isf", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
isf = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
}
try {
basal = JSONArray(SP.getString(LOCAL_PROFILE + "basal", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
basal = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
}
try {
targetLow = JSONArray(SP.getString(LOCAL_PROFILE + "targetlow", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
targetLow = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
}
try {
targetHigh = JSONArray(SP.getString(LOCAL_PROFILE + "targethigh", DEFAULTARRAY))
} catch (e1: JSONException) {
try {
targetHigh = JSONArray(DEFAULTARRAY)
} catch (ignored: JSONException) {
}
}
isEdited = false
createAndStoreConvertedProfile()
}
/*
{
"_id": "576264a12771b7500d7ad184",
"startDate": "2016-06-16T08:35:00.000Z",
"defaultProfile": "Default",
"store": {
"Default": {
"dia": "3",
"carbratio": [{
"time": "00:00",
"value": "30"
}],
"carbs_hr": "20",
"delay": "20",
"sens": [{
"time": "00:00",
"value": "100"
}],
"timezone": "UTC",
"basal": [{
"time": "00:00",
"value": "0.1"
}],
"target_low": [{
"time": "00:00",
"value": "0"
}],
"target_high": [{
"time": "00:00",
"value": "0"
}],
"startDate": "1970-01-01T00:00:00.000Z",
"units": "mmol"
}
},
"created_at": "2016-06-16T08:34:41.256Z"
}
*/
private fun createAndStoreConvertedProfile() {
rawProfile = createProfileStore()
}
fun createProfileStore(): ProfileStore {
val json = JSONObject()
val store = JSONObject()
val profile = JSONObject()
try {
json.put("defaultProfile", LOCAL_PROFILE)
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)
}
return ProfileStore(json)
}
override fun getProfile(): ProfileStore? {
return if (rawProfile?.defaultProfile?.isValid(MainApp.gs(R.string.localprofile)) != true) null else rawProfile
}
override fun getUnits(): String {
return if (mgdl) Constants.MGDL else Constants.MMOL
}
override fun getProfileName(): String {
return DecimalFormatter.to2Decimal(rawProfile?.defaultProfile?.percentageBasalSum()
?: 0.0) + "U "
}
}

View file

@ -271,8 +271,8 @@ public class SWDefinition {
.skippable(false)
.add(new SWFragment(this)
.add(new LocalProfileFragment()))
.validator(() -> LocalProfilePlugin.getPlugin().getProfile() != null && LocalProfilePlugin.getPlugin().getProfile().getDefaultProfile() != null && LocalProfilePlugin.getPlugin().getProfile().getDefaultProfile().isValid("StartupWizard"))
.visibility(() -> LocalProfilePlugin.getPlugin().isEnabled(PluginType.PROFILE));
.validator(() -> LocalProfilePlugin.INSTANCE.getProfile() != null && LocalProfilePlugin.INSTANCE.getProfile().getDefaultProfile() != null && LocalProfilePlugin.INSTANCE.getProfile().getDefaultProfile().isValid("StartupWizard"))
.visibility(() -> LocalProfilePlugin.INSTANCE.isEnabled(PluginType.PROFILE));
private SWScreen screenSimpleProfile = new SWScreen(R.string.simpleprofile)
.skippable(false)