From f7716c79feda64a2544704e9fab084006f814582 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Wed, 18 Dec 2019 23:22:03 +0100 Subject: [PATCH] TempTargetDialog --- .../general/actions/ActionsFragment.kt | 9 +- .../careportal/CareportalFragment.java | 3 +- .../Dialogs/NewNSTreatmentDialog.java | 49 ++---- .../general/careportal/OptionsToShow.java | 3 - .../general/overview/OverviewFragment.java | 11 +- .../overview/dialogs/ProfileSwitchDialog.kt | 23 ++- .../overview/dialogs/TempTargetDialog.kt | 142 ++++++++++++++++++ .../treatments/dialogs/WizardInfoDialog.kt | 2 +- .../layout/overview_profileswitch_dialog.xml | 29 ++-- .../res/layout/overview_temptarget_dialog.xml | 126 ++++++++++++++++ 10 files changed, 325 insertions(+), 72 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/TempTargetDialog.kt create mode 100644 app/src/main/res/layout/overview_temptarget_dialog.xml diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt index 7ee21eac33..490e09cb62 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt @@ -21,9 +21,8 @@ import info.nightscout.androidaps.plugins.general.actions.defs.CustomAction import info.nightscout.androidaps.plugins.general.actions.dialogs.FillDialog import info.nightscout.androidaps.plugins.general.actions.dialogs.NewExtendedBolusDialog import info.nightscout.androidaps.plugins.general.actions.dialogs.NewTempBasalDialog -import info.nightscout.androidaps.plugins.general.careportal.CareportalFragment -import info.nightscout.androidaps.plugins.general.careportal.Dialogs.NewNSTreatmentDialog import info.nightscout.androidaps.plugins.general.overview.dialogs.ProfileSwitchDialog +import info.nightscout.androidaps.plugins.general.overview.dialogs.TempTargetDialog import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin import info.nightscout.androidaps.queue.Callback import info.nightscout.androidaps.utils.* @@ -51,11 +50,7 @@ class ActionsFragment : Fragment() { fragmentManager?.let { ProfileSwitchDialog().show(it, "Actions") } } actions_temptarget.setOnClickListener { - val newTTDialog = NewNSTreatmentDialog() - val temptarget = CareportalFragment.TEMPTARGET - temptarget.executeTempTarget = true - newTTDialog.setOptions(temptarget, R.string.careportal_temporarytarget) - fragmentManager?.let { newTTDialog.show(it, "NewNSTreatmentDialog") } + fragmentManager?.let { TempTargetDialog().show(it, "Actions") } } actions_extendedbolus.setOnClickListener { fragmentManager?.let { NewExtendedBolusDialog().show(it, "NewExtendedDialog") } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/CareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/CareportalFragment.java index ceb51e366b..5dd9292343 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/CareportalFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/CareportalFragment.java @@ -200,7 +200,6 @@ public class CareportalFragment extends Fragment implements View.OnClickListener newDialog.setOptions(OPENAPSOFFLINE, R.string.careportal_openapsoffline); break; case R.id.careportal_temporarytarget: - TEMPTARGET.executeTempTarget = false; newDialog.setOptions(TEMPTARGET, R.string.careportal_temporarytarget); break; default: @@ -220,7 +219,7 @@ public class CareportalFragment extends Fragment implements View.OnClickListener activity.runOnUiThread( () -> { CareportalEvent careportalEvent; - NSSettingsStatus nsSettings = new NSSettingsStatus().getInstance(); + NSSettingsStatus nsSettings = NSSettingsStatus.getInstance(); double iageUrgent = nsSettings.getExtendedWarnValue("iage", "urgent", 96); double iageWarn = nsSettings.getExtendedWarnValue("iage", "warn", 72); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/Dialogs/NewNSTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/Dialogs/NewNSTreatmentDialog.java index 23082e1f8e..1fb0a68037 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/Dialogs/NewNSTreatmentDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/Dialogs/NewNSTreatmentDialog.java @@ -45,8 +45,6 @@ import info.nightscout.androidaps.data.ProfileStore; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.CareportalEvent; import info.nightscout.androidaps.db.ProfileSwitch; -import info.nightscout.androidaps.db.Source; -import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions; import info.nightscout.androidaps.plugins.general.careportal.OptionsToShow; @@ -68,7 +66,7 @@ public class NewNSTreatmentDialog extends AppCompatDialogFragment implements Vie private static OptionsToShow options; private static String event; - Profile profile; + private Profile profile; public ProfileStore profileStore; TextView eventTypeText; @@ -703,41 +701,18 @@ public class NewNSTreatmentDialog extends AppCompatDialogFragment implements Vie void createNSTreatment(JSONObject data) { - if (options.executeTempTarget) { - final int duration = JsonHelper.safeGetInt(data, "duration"); - final double targetBottom = JsonHelper.safeGetDouble(data, "targetBottom"); - final double targetTop = JsonHelper.safeGetDouble(data, "targetTop"); - final String reason = JsonHelper.safeGetString(data, "reason", ""); - if ((targetBottom != 0d && targetTop != 0d) || duration == 0) { - TempTarget tempTarget = new TempTarget() - .date(eventTime.getTime()) - .duration(duration) - .reason(reason) - .source(Source.USER); - if (tempTarget.durationInMinutes != 0) { - tempTarget.low(Profile.toMgdl(targetBottom, ProfileFunctions.getSystemUnits())) - .high(Profile.toMgdl(targetTop, ProfileFunctions.getSystemUnits())); - } else { - tempTarget.low(0).high(0); - } - TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget); - } - if (duration == 10) - SP.putBoolean(R.string.key_objectiveusetemptarget, true); + if (JsonHelper.safeGetString(data, "eventType").equals(CareportalEvent.PROFILESWITCH)) { + ProfileSwitch profileSwitch = ProfileFunctions.prepareProfileSwitch( + profileStore, + JsonHelper.safeGetString(data, "profile"), + JsonHelper.safeGetInt(data, "duration"), + JsonHelper.safeGetInt(data, "percentage"), + JsonHelper.safeGetInt(data, "timeshift"), + eventTime.getTime() + ); + NSUpload.uploadProfileSwitch(profileSwitch); } else { - if (JsonHelper.safeGetString(data, "eventType").equals(CareportalEvent.PROFILESWITCH)) { - ProfileSwitch profileSwitch = ProfileFunctions.prepareProfileSwitch( - profileStore, - JsonHelper.safeGetString(data, "profile"), - JsonHelper.safeGetInt(data, "duration"), - JsonHelper.safeGetInt(data, "percentage"), - JsonHelper.safeGetInt(data, "timeshift"), - eventTime.getTime() - ); - NSUpload.uploadProfileSwitch(profileSwitch); - } else { - NSUpload.uploadCareportalEntryToNS(data); - } + NSUpload.uploadCareportalEntryToNS(data); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/OptionsToShow.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/OptionsToShow.java index 46f3437fdf..e1effcd561 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/OptionsToShow.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/OptionsToShow.java @@ -19,9 +19,6 @@ public class OptionsToShow { public boolean split; public boolean tempTarget; - // perform direct actions - public boolean executeTempTarget = false; - public OptionsToShow(int eventType, int eventName) { this.eventType = eventType; this.eventName = eventName; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.java index daa68df5a0..963eb3cf3f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.java @@ -94,6 +94,7 @@ import info.nightscout.androidaps.plugins.general.overview.dialogs.NewCarbsDialo import info.nightscout.androidaps.plugins.general.overview.dialogs.NewInsulinDialog; import info.nightscout.androidaps.plugins.general.overview.dialogs.NewTreatmentDialog; import info.nightscout.androidaps.plugins.general.overview.dialogs.ProfileSwitchDialog; +import info.nightscout.androidaps.plugins.general.overview.dialogs.TempTargetDialog; import info.nightscout.androidaps.plugins.general.overview.dialogs.WizardDialog; import info.nightscout.androidaps.plugins.general.overview.graphData.GraphData; import info.nightscout.androidaps.plugins.general.wear.ActionStringHandler; @@ -791,11 +792,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, .high(target); TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget); } else if (item.getTitle().equals(MainApp.gs(R.string.custom))) { - NewNSTreatmentDialog newTTDialog = new NewNSTreatmentDialog(); - final OptionsToShow temptarget = CareportalFragment.TEMPTARGET; - temptarget.executeTempTarget = true; - newTTDialog.setOptions(temptarget, R.string.careportal_temporarytarget); - newTTDialog.show(getFragmentManager(), "NewNSTreatmentDialog"); + FragmentManager manager = getFragmentManager(); + if (manager != null) + new TempTargetDialog().show(manager, "Overview"); } else if (item.getTitle().equals(MainApp.gs(R.string.cancel))) { TempTarget tempTarget = new TempTarget() .source(Source.USER) @@ -817,7 +816,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, FragmentManager manager = getFragmentManager(); // try to fix https://fabric.io/nightscout3/android/apps/info.nightscout.androidaps/issues/5aca7a1536c7b23527eb4be7?time=last-seven-days // https://stackoverflow.com/questions/14860239/checking-if-state-is-saved-before-committing-a-fragmenttransaction - if (manager.isStateSaved()) + if (manager == null || manager.isStateSaved()) return; switch (v.getId()) { case R.id.overview_accepttempbutton: diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/ProfileSwitchDialog.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/ProfileSwitchDialog.kt index 2a399422c8..e8c4083a39 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/ProfileSwitchDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/ProfileSwitchDialog.kt @@ -1,7 +1,9 @@ package info.nightscout.androidaps.plugins.general.overview.dialogs import android.os.Bundle -import android.view.* +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import android.widget.ArrayAdapter import com.google.common.base.Joiner import info.nightscout.androidaps.Constants @@ -9,18 +11,18 @@ import info.nightscout.androidaps.MainApp import info.nightscout.androidaps.R import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions +import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.HtmlHelper import info.nightscout.androidaps.utils.OKDialog import kotlinx.android.synthetic.main.okcancel.* import kotlinx.android.synthetic.main.overview_profileswitch_dialog.* -import org.slf4j.LoggerFactory import java.text.DecimalFormat import java.util.* class ProfileSwitchDialog : DialogFragmentWithDate() { - override fun onSaveInstanceState(savedInstanceState: Bundle) { + override fun onSaveInstanceState(savedInstanceState: Bundle) { super.onSaveInstanceState(savedInstanceState) savedInstanceState.putDouble("overview_profileswitch_duration", overview_profileswitch_duration.value) savedInstanceState.putDouble("overview_profileswitch_percentage", overview_profileswitch_percentage.value) @@ -55,6 +57,19 @@ class ProfileSwitchDialog : DialogFragmentWithDate() { if (profileList[p] == ProfileFunctions.getInstance().getProfileName(false)) overview_profileswitch_profile.setSelection(p) } ?: return + + TreatmentsPlugin.getPlugin().getProfileSwitchFromHistory(DateUtil.now())?.let { ps -> + if (ps.isCPP) { + overview_profileswitch_reuselayout.visibility = View.VISIBLE + overview_profileswitch_reusebutton.text = MainApp.gs(R.string.reuse) + " " + ps.percentage + "% " + ps.timeshift + "h" + overview_profileswitch_reusebutton.setOnClickListener { + overview_profileswitch_percentage.value = ps.percentage.toDouble() + overview_profileswitch_timeshift.value = ps.timeshift.toDouble() + } + } else { + overview_profileswitch_reuselayout.visibility = View.GONE + } + } } override fun submit() { @@ -65,7 +80,7 @@ class ProfileSwitchDialog : DialogFragmentWithDate() { if (duration > 0) actions.add(MainApp.gs(R.string.duration) + ": " + MainApp.gs(R.string.format_hours, duration)) val profile = overview_profileswitch_profile.selectedItem.toString() - actions.add(MainApp.gs(R.string.profile).toString() + ": " + profile) + actions.add(MainApp.gs(R.string.profile) + ": " + profile) val percent = overview_profileswitch_percentage.value.toInt() if (percent != 100) actions.add(MainApp.gs(R.string.percent) + ": " + percent + "%") diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/TempTargetDialog.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/TempTargetDialog.kt new file mode 100644 index 0000000000..513a072174 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/TempTargetDialog.kt @@ -0,0 +1,142 @@ +package info.nightscout.androidaps.plugins.general.overview.dialogs + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter +import com.google.common.base.Joiner +import com.google.common.collect.Lists +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.db.Source +import info.nightscout.androidaps.db.TempTarget +import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions +import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin +import info.nightscout.androidaps.utils.* +import kotlinx.android.synthetic.main.okcancel.* +import kotlinx.android.synthetic.main.overview_temptarget_dialog.* +import java.text.DecimalFormat +import java.util.* + +class TempTargetDialog : DialogFragmentWithDate() { + + override fun onSaveInstanceState(savedInstanceState: Bundle) { + super.onSaveInstanceState(savedInstanceState) + savedInstanceState.putDouble("overview_temptarget_duration", overview_temptarget_duration.value) + savedInstanceState.putDouble("overview_temptarget_temptarget", overview_temptarget_temptarget.value) + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + onCreateView() + return inflater.inflate(R.layout.overview_temptarget_dialog, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + overview_temptarget_duration.setParams(savedInstanceState?.getDouble("overview_temptarget_duration") + ?: 0.0, 0.0, Constants.MAX_PROFILE_SWITCH_DURATION, 10.0, DecimalFormat("0"), false, ok) + + if (ProfileFunctions.getSystemUnits() == Constants.MMOL) + overview_temptarget_temptarget.setParams( + savedInstanceState?.getDouble("overview_temptarget_temptarget") + ?: Constants.MIN_TT_MMOL, + Constants.MIN_TT_MMOL, Constants.MAX_TT_MMOL, 0.1, DecimalFormat("0.0"), false, ok) + else + overview_temptarget_temptarget.setParams( + savedInstanceState?.getDouble("overview_temptarget_temptarget") + ?: Constants.MIN_TT_MGDL, + Constants.MIN_TT_MGDL, Constants.MAX_TT_MGDL, 1.0, DecimalFormat("0"), false, ok) + + // temp target + context?.let { context -> + val reasonList: List = Lists.newArrayList( + MainApp.gs(R.string.manual), + MainApp.gs(R.string.cancel), + MainApp.gs(R.string.eatingsoon), + MainApp.gs(R.string.activity), + MainApp.gs(R.string.hypo) + ) + val adapterReason = ArrayAdapter(context, R.layout.spinner_centered, reasonList) + overview_temptarget_reason.adapter = adapterReason + overview_temptarget_reason.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>?, view: View, position: Int, id: Long) { + val defaultDuration: Double + val defaultTarget: Double + val helper = DefaultValueHelper() + when (reasonList[position]) { + MainApp.gs(R.string.eatingsoon) -> { + defaultDuration = helper.determineEatingSoonTTDuration().toDouble() + defaultTarget = helper.determineEatingSoonTT() + } + MainApp.gs(R.string.activity) -> { + defaultDuration = helper.determineActivityTTDuration().toDouble() + defaultTarget = helper.determineActivityTT() + } + MainApp.gs(R.string.hypo) -> { + defaultDuration = helper.determineHypoTTDuration().toDouble() + defaultTarget = helper.determineHypoTT() + } + MainApp.gs(R.string.cancel) -> { + defaultDuration = 0.0 + defaultTarget = 0.0 + } + else -> { + defaultDuration = overview_temptarget_duration.value + defaultTarget = overview_temptarget_temptarget.value + } + } + overview_temptarget_temptarget.value = defaultTarget + overview_temptarget_duration.value = defaultDuration + } + + override fun onNothingSelected(parent: AdapterView<*>?) {} + } + } + } + + override fun submit() { + val actions: LinkedList = LinkedList() + val reason = overview_temptarget_reason.selectedItem.toString() + val unitResId = if (ProfileFunctions.getSystemUnits() == Constants.MGDL) R.string.mgdl else R.string.mmol + val target = overview_temptarget_temptarget.value + val duration = overview_temptarget_duration.value + if (target != 0.0 && duration != 0.0) { + actions.add(MainApp.gs(R.string.reason) + ": " + reason) + actions.add(MainApp.gs(R.string.nsprofileview_target_label) + ": " + Profile.toCurrentUnitsString(target) + " " + MainApp.gs(unitResId)) + actions.add(MainApp.gs(R.string.duration) + ": " + MainApp.gs(R.string.format_hours, duration)) + } else { + actions.add(MainApp.gs(R.string.stoptemptarget)) + } + if (eventTimeChanged) + actions.add(MainApp.gs(R.string.time) + ": " + DateUtil.dateAndTimeString(eventTime)) + + activity?.let { activity -> + OKDialog.showConfirmation(activity, HtmlHelper.fromHtml(Joiner.on("
").join(actions))) { + if (target == 0.0 || duration == 0.0) { + val tempTarget = TempTarget() + .date(eventTime) + .duration(0) + .low(0.0).high(0.0) + .source(Source.USER) + TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget) + } else { + val tempTarget = TempTarget() + .date(eventTime) + .duration(duration.toInt()) + .reason(reason) + .source(Source.USER) + .low(Profile.toMgdl(target, ProfileFunctions.getSystemUnits())) + .high(Profile.toMgdl(target, ProfileFunctions.getSystemUnits())) + TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget) + } + if (duration == 10.0) SP.putBoolean(R.string.key_objectiveusetemptarget, true) + } + } + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/treatments/dialogs/WizardInfoDialog.kt b/app/src/main/java/info/nightscout/androidaps/plugins/treatments/dialogs/WizardInfoDialog.kt index 50bf9aa790..63f3b57f65 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/treatments/dialogs/WizardInfoDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/treatments/dialogs/WizardInfoDialog.kt @@ -35,7 +35,7 @@ class WizardInfoDialog : DialogFragment() { close.setOnClickListener { dismiss() } val units = ProfileFunctions.getSystemUnits() - var bg_string= "" + val bg_string: String if (units.equals(Constants.MGDL)) { bg_string = DecimalFormatter.to0Decimal(JsonHelper.safeGetDouble(json, "bg"))} else { bg_string = DecimalFormatter.to1Decimal(JsonHelper.safeGetDouble(json, "bg"))} // BG treatments_wizard_bg.text = MainApp.gs(R.string.format_bg_isf, bg_string , JsonHelper.safeGetDouble(json, "isf")) diff --git a/app/src/main/res/layout/overview_profileswitch_dialog.xml b/app/src/main/res/layout/overview_profileswitch_dialog.xml index 3d9cc76aed..0ab8c67da6 100644 --- a/app/src/main/res/layout/overview_profileswitch_dialog.xml +++ b/app/src/main/res/layout/overview_profileswitch_dialog.xml @@ -22,7 +22,8 @@ + android:src="@drawable/icon_actions_profileswitch" + android:contentDescription="@string/careportal_profileswitch" /> @@ -87,12 +89,12 @@ android:id="@+id/overview_profileswitch_profile" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_centerInParent="true" android:layout_gravity="center_vertical" /> @@ -150,9 +153,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:gravity="left" + android:gravity="start" android:minWidth="45dp" - android:paddingLeft="5dp" + android:paddingStart="5dp" + android:paddingEnd="5dp" android:text="%" android:textAppearance="?android:attr/textAppearanceSmall" /> @@ -182,10 +186,11 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:gravity="left" + android:gravity="start" android:minWidth="45dp" - android:paddingLeft="5dp" - android:text="h" + android:paddingStart="5dp" + android:paddingEnd="5dp" + android:text="@string/unit_hours" android:textAppearance="?android:attr/textAppearanceSmall" /> diff --git a/app/src/main/res/layout/overview_temptarget_dialog.xml b/app/src/main/res/layout/overview_temptarget_dialog.xml new file mode 100644 index 0000000000..02e6dce6d8 --- /dev/null +++ b/app/src/main/res/layout/overview_temptarget_dialog.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +