From 8da6513a39baf12aa2646e8a7f715a4c40ab9e5a Mon Sep 17 00:00:00 2001 From: Philoul Date: Sat, 13 Apr 2024 13:21:42 +0200 Subject: [PATCH 01/12] Include Direct menu for time range in graphs --- .../aaps/activities/HistoryBrowseActivity.kt | 22 +++++++++++++++++++ .../main/general/overview/OverviewFragment.kt | 21 ++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt b/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt index 77aa449fae9..be1c7f58d00 100644 --- a/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt +++ b/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt @@ -4,10 +4,13 @@ import android.annotation.SuppressLint import android.content.Context import android.os.Bundle import android.util.DisplayMetrics +import android.view.Menu +import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import android.widget.RelativeLayout import android.widget.TextView +import androidx.appcompat.widget.PopupMenu import app.aaps.core.data.time.T import app.aaps.core.interfaces.configuration.Config import app.aaps.core.interfaces.logging.AAPSLogger @@ -128,6 +131,25 @@ class HistoryBrowseActivity : TranslatedDaggerAppCompatActivity() { .show(supportFragmentManager, "history_date_picker") } + binding.chartMenuButton.setOnLongClickListener { v: View -> + val popup = PopupMenu(v.context, v) + popup.menu.add(Menu.NONE, 6, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 6, 6)) + popup.menu.add(Menu.NONE, 12, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 12, 12)) + popup.menu.add(Menu.NONE, 18, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 18, 18)) + popup.menu.add(Menu.NONE, 24, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 24, 24)) + popup.setOnMenuItemClickListener { + // id == Range to display ... + rangeToDisplay = it.itemId + setTime(historyBrowserData.overviewData.fromTime) + loadAll("rangeChange") + return@setOnMenuItemClickListener true + } + binding.chartMenuButton.setImageResource(app.aaps.plugins.main.R.drawable.ic_arrow_drop_up_white_24dp) + popup.setOnDismissListener { binding.chartMenuButton.setImageResource(app.aaps.plugins.main.R.drawable.ic_arrow_drop_down_white_24dp) } + popup.show() + false + } + val dm = DisplayMetrics() @Suppress("DEPRECATION") if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt index cadb99aa0b7..02c6c2685b7 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt @@ -16,12 +16,14 @@ import android.os.HandlerThread import android.util.DisplayMetrics import android.util.TypedValue import android.view.LayoutInflater +import android.view.Menu import android.view.View import android.view.View.OnLongClickListener import android.view.ViewGroup import android.widget.LinearLayout import android.widget.RelativeLayout import android.widget.TextView +import androidx.appcompat.widget.PopupMenu import androidx.core.text.toSpanned import androidx.recyclerview.widget.LinearLayoutManager import app.aaps.core.data.configuration.Constants @@ -220,6 +222,25 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList sp.putBoolean(app.aaps.core.utils.R.string.key_objectiveusescale, true) false } + + binding.graphsLayout.chartMenuButton.setOnLongClickListener { v: View -> + val popup = PopupMenu(v.context, v) + popup.menu.add(Menu.NONE, 6, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 6, 6)) + popup.menu.add(Menu.NONE, 12, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 12, 12)) + popup.menu.add(Menu.NONE, 18, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 18, 18)) + popup.menu.add(Menu.NONE, 24, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 24, 24)) + popup.setOnMenuItemClickListener { + // id == Range to display ... + sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, it.itemId) + rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) + return@setOnMenuItemClickListener true + } + binding.graphsLayout.chartMenuButton.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp) + popup.setOnDismissListener { binding.graphsLayout.chartMenuButton.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp) } + popup.show() + false + } + prepareGraphsIfNeeded(overviewMenus.setting.size) context?.let { overviewMenus.setupChartMenu(it, binding.graphsLayout.chartMenuButton) } binding.graphsLayout.chartMenuButton.visibility = preferences.simpleMode.not().toVisibility() From cb2926b4c59c1cd769b870852022e2c26145b793 Mon Sep 17 00:00:00 2001 From: Philoul Date: Fri, 19 Apr 2024 18:06:34 +0200 Subject: [PATCH 02/12] Graph Keep menu on item click --- .../aaps/plugins/main/general/overview/OverviewMenusImpl.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt index f1d8682a2d2..0498b6e2749 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt @@ -175,6 +175,7 @@ class OverviewMenusImpl @Inject constructor( } popup.setOnMenuItemClickListener { + var keepMenu = false synchronized(this) { try { // id < 100 graph header - divider 1, 2, 3 ..... @@ -191,17 +192,20 @@ class OverviewMenusImpl @Inject constructor( it.itemId == numOfGraphs -> { // add new empty _setting.add(Array(CharTypeData.entries.size) { false }) + keepMenu = true } it.itemId < 100 -> { // remove graph _setting.removeAt(it.itemId) + keepMenu = true } else -> { val graphNumber = it.itemId / 100 - 1 val item = it.itemId % 100 _setting[graphNumber][item] = !it.isChecked + keepMenu = true } } } catch (exception: Exception) { @@ -210,6 +214,8 @@ class OverviewMenusImpl @Inject constructor( } storeGraphConfig() setupChartMenu(context, chartButton) + if (keepMenu) + chartButton.performClick() rxBus.send(EventRefreshOverview("OnMenuItemClickListener", now = true)) return@setOnMenuItemClickListener true } From 20dafb9c049d7243bff73d356086f7dd1b4853f9 Mon Sep 17 00:00:00 2001 From: Philoul Date: Wed, 24 Apr 2024 10:05:10 +0200 Subject: [PATCH 03/12] Graph Rescale added on main graph --- .../aaps/activities/HistoryBrowseActivity.kt | 42 +++++++++++++++- .../res/layout/activity_historybrowse.xml | 49 ++++++++++++++++++ .../main/general/overview/OverviewFragment.kt | 35 +++++++++++++ .../res/layout/overview_graphs_layout.xml | 50 +++++++++++++++++++ plugins/main/src/main/res/values/strings.xml | 8 +++ 5 files changed, 183 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt b/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt index be1c7f58d00..b314c0eba48 100644 --- a/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt +++ b/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt @@ -150,6 +150,32 @@ class HistoryBrowseActivity : TranslatedDaggerAppCompatActivity() { false } + + binding.graphScale6h.setOnClickListener { + rangeToDisplay = 6 + resetScaleText() + setTime(historyBrowserData.overviewData.fromTime) + loadAll("rangeChange") + } + binding.graphScale12h.setOnClickListener { + rangeToDisplay = 12 + resetScaleText() + setTime(historyBrowserData.overviewData.fromTime) + loadAll("rangeChange") + } + binding.graphScale18h.setOnClickListener { + rangeToDisplay = 18 + resetScaleText() + setTime(historyBrowserData.overviewData.fromTime) + loadAll("rangeChange") + } + binding.graphScale24h.setOnClickListener { + rangeToDisplay = 24 + resetScaleText() + setTime(historyBrowserData.overviewData.fromTime) + loadAll("rangeChange") + } + val dm = DisplayMetrics() @Suppress("DEPRECATION") if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) @@ -261,6 +287,20 @@ class HistoryBrowseActivity : TranslatedDaggerAppCompatActivity() { } } + + private fun resetScaleText() { + binding.graphScale6h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Small) + binding.graphScale12h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Small) + binding.graphScale18h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Small) + binding.graphScale24h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Small) + when (rangeToDisplay) { + 6 -> binding.graphScale6h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) + 12 -> binding.graphScale12h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) + 18 -> binding.graphScale18h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) + 24 -> binding.graphScale24h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) + } + } + @Suppress("SameParameterValue") private fun loadAll(from: String) { updateDate() @@ -318,7 +358,7 @@ class HistoryBrowseActivity : TranslatedDaggerAppCompatActivity() { aapsLogger.debug(LTag.UI, "updateGui $from") updateDate() - + resetScaleText() val pump = activePlugin.activePump val graphData = GraphData(injector, binding.bgGraph, historyBrowserData.overviewData) val menuChartSettings = overviewMenus.setting diff --git a/app/src/main/res/layout/activity_historybrowse.xml b/app/src/main/res/layout/activity_historybrowse.xml index 5e309f77e09..0b277450569 100644 --- a/app/src/main/res/layout/activity_historybrowse.xml +++ b/app/src/main/res/layout/activity_historybrowse.xml @@ -77,6 +77,55 @@ android:id="@+id/bg_graph" android:layout_width="wrap_content" android:layout_height="match_parent" /> + + + + + + + + + + + binding.graphsLayout.graphScale6h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) + 12 -> binding.graphsLayout.graphScale12h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) + 18 -> binding.graphsLayout.graphScale18h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) + 24 -> binding.graphsLayout.graphScale24h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) + } + } + @Synchronized override fun onPause() { super.onPause() @@ -372,6 +406,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList if (!config.appInitialized) return runOnUiThread { _binding ?: return@runOnUiThread + resetScaleText() updateTime() updateSensitivity() updateGraph() diff --git a/plugins/main/src/main/res/layout/overview_graphs_layout.xml b/plugins/main/src/main/res/layout/overview_graphs_layout.xml index 1bca74a8093..1b7cd552a42 100644 --- a/plugins/main/src/main/res/layout/overview_graphs_layout.xml +++ b/plugins/main/src/main/res/layout/overview_graphs_layout.xml @@ -17,6 +17,56 @@ android:layout_height="200dp" android:contentDescription="@string/a11y_graph" /> + + + + + + + + + + + + Threshold warning pump battery level [%] Threshold critical pump battery level [%] Copy settings from NS + 6 hours + 12h + 18h + 24h graph + graph scale 6 hours + graph scale 12 hours + graph scale 18 hours + graph scale 24 hours insulin Chart menu blood glucose quality From 9aa02b2b0eb9181a0aac3ac1d5e117c3920fe4d5 Mon Sep 17 00:00:00 2001 From: Philoul Date: Sun, 28 Apr 2024 00:40:27 +0200 Subject: [PATCH 04/12] GraphScale TextView Selection --- .../kotlin/app/aaps/activities/HistoryBrowseActivity.kt | 8 ++++---- .../plugins/main/general/overview/OverviewFragment.kt | 8 ++++---- plugins/main/src/main/res/values/strings.xml | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt b/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt index b314c0eba48..ec573d2b835 100644 --- a/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt +++ b/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt @@ -294,10 +294,10 @@ class HistoryBrowseActivity : TranslatedDaggerAppCompatActivity() { binding.graphScale18h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Small) binding.graphScale24h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Small) when (rangeToDisplay) { - 6 -> binding.graphScale6h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) - 12 -> binding.graphScale12h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) - 18 -> binding.graphScale18h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) - 24 -> binding.graphScale24h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) + 6 -> binding.graphScale6h.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.highColor)) + 12 -> binding.graphScale12h.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.highColor)) + 18 -> binding.graphScale18h.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.highColor)) + 24 -> binding.graphScale24h.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.highColor)) } } diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt index 1448a03e9ea..e4375404fb6 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt @@ -289,10 +289,10 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList binding.graphsLayout.graphScale18h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Small) binding.graphsLayout.graphScale24h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Small) when (sp.getInt(app.aaps.core.utils.R.string.key_rangetodisplay,6)) { - 6 -> binding.graphsLayout.graphScale6h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) - 12 -> binding.graphsLayout.graphScale12h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) - 18 -> binding.graphsLayout.graphScale18h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) - 24 -> binding.graphsLayout.graphScale24h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium) + 6 -> binding.graphsLayout.graphScale6h.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.highColor)) + 12 -> binding.graphsLayout.graphScale12h.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.highColor)) + 18 -> binding.graphsLayout.graphScale18h.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.highColor)) + 24 -> binding.graphsLayout.graphScale24h.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.highColor)) } } diff --git a/plugins/main/src/main/res/values/strings.xml b/plugins/main/src/main/res/values/strings.xml index 73e5b2d5534..35fabd35569 100644 --- a/plugins/main/src/main/res/values/strings.xml +++ b/plugins/main/src/main/res/values/strings.xml @@ -203,7 +203,7 @@ Threshold warning pump battery level [%] Threshold critical pump battery level [%] Copy settings from NS - 6 hours + 6h 12h 18h 24h From 44d5fbceb67bc93c18bf11fe4efd5e8fc4e9b0af Mon Sep 17 00:00:00 2001 From: kenzo44 Date: Sat, 27 Apr 2024 17:48:09 -0600 Subject: [PATCH 05/12] Added material chips to Overview --- .../main/general/overview/OverviewFragment.kt | 66 ++++++++++++++++++ .../general/overview/OverviewMenusImpl.kt | 6 ++ .../res/layout/overview_graphs_layout.xml | 68 ++++++++++++++++--- plugins/main/src/main/res/values/strings.xml | 8 +++ 4 files changed, 137 insertions(+), 11 deletions(-) diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt index cadb99aa0b7..a5b5b35907e 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt @@ -16,12 +16,15 @@ import android.os.HandlerThread import android.util.DisplayMetrics import android.util.TypedValue import android.view.LayoutInflater +import android.view.Menu import android.view.View import android.view.View.OnLongClickListener import android.view.ViewGroup import android.widget.LinearLayout import android.widget.RelativeLayout +import android.graphics.Typeface import android.widget.TextView +import androidx.appcompat.widget.PopupMenu import androidx.core.text.toSpanned import androidx.recyclerview.widget.LinearLayoutManager import app.aaps.core.data.configuration.Constants @@ -220,6 +223,54 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList sp.putBoolean(app.aaps.core.utils.R.string.key_objectiveusescale, true) false } + + val selectedScale = sp.getInt(app.aaps.core.utils.R.string.key_rangetodisplay, 6) + when (selectedScale) { + 6 -> binding.graphsLayout.graphScale6h.isChecked = true + 12 -> binding.graphsLayout.graphScale12h.isChecked = true + 18 -> binding.graphsLayout.graphScale18h.isChecked = true + 24 -> binding.graphsLayout.graphScale24h.isChecked = true + } + + binding.graphsLayout.chartMenuButton.setOnLongClickListener { v: View -> + val popup = PopupMenu(v.context, v) + popup.menu.add(Menu.NONE, 6, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 6, 6)) + popup.menu.add(Menu.NONE, 12, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 12, 12)) + popup.menu.add(Menu.NONE, 18, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 18, 18)) + popup.menu.add(Menu.NONE, 24, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 24, 24)) + popup.setOnMenuItemClickListener { + // id == Range to display ... + sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, it.itemId) + rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) + return@setOnMenuItemClickListener true + } + binding.graphsLayout.chartMenuButton.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp) + popup.setOnDismissListener { binding.graphsLayout.chartMenuButton.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp) } + popup.show() + false + } + + binding.graphsLayout.graphScale6h.setOnClickListener { + sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, 6) + resetScaleText() + rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) + } + binding.graphsLayout.graphScale12h.setOnClickListener { + sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, 12) + resetScaleText() + rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) + } + binding.graphsLayout.graphScale18h.setOnClickListener { + sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, 18) + resetScaleText() + rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) + } + binding.graphsLayout.graphScale24h.setOnClickListener { + sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, 24) + resetScaleText() + rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) + } + prepareGraphsIfNeeded(overviewMenus.setting.size) context?.let { overviewMenus.setupChartMenu(it, binding.graphsLayout.chartMenuButton) } binding.graphsLayout.chartMenuButton.visibility = preferences.simpleMode.not().toVisibility() @@ -241,6 +292,20 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList binding.infoLayout.apsMode.setOnLongClickListener(this) } + fun resetScaleText() { + binding.graphsLayout.graphScale6h.setTypeface(null, Typeface.NORMAL) + binding.graphsLayout.graphScale12h.setTypeface(null, Typeface.NORMAL) + binding.graphsLayout.graphScale18h.setTypeface(null, Typeface.NORMAL) + binding.graphsLayout.graphScale24h.setTypeface(null, Typeface.NORMAL) + + when (sp.getInt(app.aaps.core.utils.R.string.key_rangetodisplay,6)) { + 6 -> binding.graphsLayout.graphScale6h.setTypeface(null, Typeface.BOLD) + 12 -> binding.graphsLayout.graphScale12h.setTypeface(null, Typeface.BOLD) + 18 -> binding.graphsLayout.graphScale18h.setTypeface(null, Typeface.BOLD) + 24 -> binding.graphsLayout.graphScale24h.setTypeface(null, Typeface.BOLD) + } + } + @Synchronized override fun onPause() { super.onPause() @@ -351,6 +416,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList if (!config.appInitialized) return runOnUiThread { _binding ?: return@runOnUiThread + resetScaleText() updateTime() updateSensitivity() updateGraph() diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt index f1d8682a2d2..0498b6e2749 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt @@ -175,6 +175,7 @@ class OverviewMenusImpl @Inject constructor( } popup.setOnMenuItemClickListener { + var keepMenu = false synchronized(this) { try { // id < 100 graph header - divider 1, 2, 3 ..... @@ -191,17 +192,20 @@ class OverviewMenusImpl @Inject constructor( it.itemId == numOfGraphs -> { // add new empty _setting.add(Array(CharTypeData.entries.size) { false }) + keepMenu = true } it.itemId < 100 -> { // remove graph _setting.removeAt(it.itemId) + keepMenu = true } else -> { val graphNumber = it.itemId / 100 - 1 val item = it.itemId % 100 _setting[graphNumber][item] = !it.isChecked + keepMenu = true } } } catch (exception: Exception) { @@ -210,6 +214,8 @@ class OverviewMenusImpl @Inject constructor( } storeGraphConfig() setupChartMenu(context, chartButton) + if (keepMenu) + chartButton.performClick() rxBus.send(EventRefreshOverview("OnMenuItemClickListener", now = true)) return@setOnMenuItemClickListener true } diff --git a/plugins/main/src/main/res/layout/overview_graphs_layout.xml b/plugins/main/src/main/res/layout/overview_graphs_layout.xml index 1bca74a8093..ea5db6414ef 100644 --- a/plugins/main/src/main/res/layout/overview_graphs_layout.xml +++ b/plugins/main/src/main/res/layout/overview_graphs_layout.xml @@ -6,6 +6,63 @@ android:layout_height="match_parent" android:orientation="vertical"> + + + + + + + + + + + + + + + + + + - - Threshold warning pump battery level [%] Threshold critical pump battery level [%] Copy settings from NS + 6h + 12h + 18h + 24h graph + graph scale 6 hours + graph scale 12 hours + graph scale 18 hours + graph scale 24 hours insulin Chart menu blood glucose quality From 516c2aae356c840bf87ebfb3e2393c2f40a79e17 Mon Sep 17 00:00:00 2001 From: Philoul Date: Sun, 12 May 2024 17:00:03 +0200 Subject: [PATCH 06/12] Rework Graph Menu --- .../general/overview/OverviewMenusImpl.kt | 205 ++++++++++-------- 1 file changed, 113 insertions(+), 92 deletions(-) diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt index 0498b6e2749..864f078cb9c 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt @@ -4,12 +4,16 @@ import android.content.Context import android.text.SpannableString import android.text.style.BackgroundColorSpan import android.text.style.ForegroundColorSpan -import android.view.Menu +import android.view.Gravity import android.view.View +import android.widget.CheckBox +import android.widget.CompoundButton import android.widget.ImageButton +import android.widget.PopupWindow +import android.widget.TextView import androidx.annotation.AttrRes import androidx.annotation.StringRes -import androidx.appcompat.widget.PopupMenu +import androidx.gridlayout.widget.GridLayout import app.aaps.core.interfaces.aps.Loop import app.aaps.core.interfaces.configuration.Config import app.aaps.core.interfaces.logging.AAPSLogger @@ -17,7 +21,6 @@ import app.aaps.core.interfaces.overview.OverviewMenus import app.aaps.core.interfaces.resources.ResourceHelper import app.aaps.core.interfaces.rx.bus.RxBus import app.aaps.core.interfaces.rx.events.EventRefreshOverview -import app.aaps.core.interfaces.rx.events.EventScale import app.aaps.core.interfaces.sharedPreferences.SP import app.aaps.core.interfaces.utils.fabric.FabricPrivacy import app.aaps.core.keys.Preferences @@ -67,7 +70,6 @@ class OverviewMenusImpl @Inject constructor( companion object { const val MAX_GRAPHS = 5 // including main - const val SCALE_ID = 1001 } override fun enabledTypes(graph: Int): String { @@ -84,13 +86,18 @@ class OverviewMenusImpl @Inject constructor( override val setting: List> @Synchronized get() = - if (!preferences.simpleMode) - _setting.toMutableList() // implicitly does a list copy + if (!preferences.simpleMode) // implicitly does a list copy and update according to number of graphs + _setting.toMutableList().also { + while(_setting.size < MAX_GRAPHS) + _setting.add(Array(CharTypeData.entries.size) { false }) + } else listOf( arrayOf(true, true, true, false, false, false, false, false, false, false, false, false, false, false), arrayOf(false, false, false, false, true, false, false, false, false, false, false, false, false, false), - arrayOf(false, false, false, false, false, true, false, false, false, false, false, false, false, false) + arrayOf(false, false, false, false, false, true, false, false, false, false, false, false, false, false), + arrayOf(false, false, false, false, false, false, false, false, false, false, false, false, false, false), + arrayOf(false, false, false, false, false, false, false, false, false, false, false, false, false, false) ) @Synchronized @@ -119,8 +126,7 @@ class OverviewMenusImpl @Inject constructor( } override fun setupChartMenu(context: Context, chartButton: ImageButton) { - val settingsCopy = setting - val numOfGraphs = settingsCopy.size // 1 main + x secondary + var itemRow = 0 chartButton.setOnClickListener { v: View -> val predictionsAvailable: Boolean = when { @@ -128,100 +134,115 @@ class OverviewMenusImpl @Inject constructor( config.NSCLIENT -> true else -> false } - val popup = PopupMenu(v.context, v) + val popup = PopupWindow(v.context) + val layout = GridLayout(v.context) + layout.columnCount = 5 - popup.menu.addSubMenu(Menu.NONE, SCALE_ID, Menu.NONE, rh.gs(R.string.graph_scale)).also { - it.add(Menu.NONE, SCALE_ID + 6, Menu.NONE, "6") - it.add(Menu.NONE, SCALE_ID + 12, Menu.NONE, "12") - it.add(Menu.NONE, SCALE_ID + 18, Menu.NONE, "18") - it.add(Menu.NONE, SCALE_ID + 24, Menu.NONE, "24") + // instert primary items + CharTypeData.entries.forEach { m -> + var insert = true + if (m == CharTypeData.PRE) insert = predictionsAvailable + if (insert && m.primary) { + createCustomMenuItemView(v.context, m, itemRow, layout) + itemRow++ + } } - val used = arrayListOf() - - for (g in 0 until numOfGraphs) { - if (g != 0) { - val dividerItem = popup.menu.add(Menu.NONE, g, Menu.NONE, "------- ${rh.gs(R.string.graph_menu_divider_header)} $g -------") - dividerItem.isCheckable = true - dividerItem.isChecked = true + // insert hearder row + var layoutParamsLabel = GridLayout.LayoutParams(GridLayout.spec(itemRow, 1), GridLayout.spec(0, 1)) + val textView = TextView(context).also { + it.text = " ${rh.gs(R.string.graph_menu_divider_header)}" + } + layout.addView(textView, layoutParamsLabel) + for (i in 1..4) { + val item = TextView(context).also { + it.gravity = Gravity.CENTER + it.text = "$i" } - CharTypeData.entries.forEach { m -> - if (g == 0 && !m.primary) return@forEach - if (g > 0 && !m.secondary) return@forEach - var insert = true - if (m == CharTypeData.PRE) insert = predictionsAvailable - if (m == CharTypeData.DEVSLOPE) insert = config.isDev() - if (used.contains(m.ordinal)) insert = false - for (g2 in g + 1 until numOfGraphs) { - if (settingsCopy[g2][m.ordinal]) insert = false - } - if (insert) { - val item = popup.menu.add(Menu.NONE, m.ordinal + 100 * (g + 1), Menu.NONE, rh.gs(m.nameId)) - val title = item.title - val s = SpannableString(" $title ") - s.setSpan(ForegroundColorSpan(rh.gac(m.attrTextId)), 0, s.length, 0) - s.setSpan(BackgroundColorSpan(rh.gac(m.attrId)), 0, s.length, 0) - item.title = s - item.isCheckable = true - item.isChecked = settingsCopy[g][m.ordinal] - if (settingsCopy[g][m.ordinal]) used.add(m.ordinal) - } + layoutParamsLabel = GridLayout.LayoutParams(GridLayout.spec(itemRow, 1), GridLayout.spec(i, 1)).apply { + setGravity(Gravity.CENTER) } + layout.addView(item, layoutParamsLabel) } - if (numOfGraphs < MAX_GRAPHS) { - val dividerItem = popup.menu.add(Menu.NONE, numOfGraphs, Menu.NONE, "------- ${rh.gs(R.string.graph_menu_divider_header)} $numOfGraphs -------") - dividerItem.isCheckable = true - dividerItem.isChecked = false + itemRow++ + + // instert secondary items + CharTypeData.entries.forEach { m -> + var insert = true + if (m == CharTypeData.DEVSLOPE) insert = config.isDev() + if (insert && m.secondary) { + createCustomMenuItemView(v.context, m, itemRow, layout) + itemRow++ + } + } + + popup.contentView = layout + // Permettre la fermeture de la PopupWindow en touchant en dehors + popup.isOutsideTouchable = true + popup.isFocusable = true + + popup.setOnDismissListener { + // todo: reorganize graph to remove empty graphs in the middle + + rxBus.send(EventRefreshOverview("OnMenuItemClickListener", now = true)) } - popup.setOnMenuItemClickListener { - var keepMenu = false - synchronized(this) { - try { - // id < 100 graph header - divider 1, 2, 3 ..... - when { - it.itemId == SCALE_ID -> { - // do nothing, submenu - } - - it.itemId > SCALE_ID && it.itemId < SCALE_ID + 100 -> { - val hours = it.itemId - SCALE_ID // 6,12,.... - rxBus.send(EventScale(hours)) - } - - it.itemId == numOfGraphs -> { - // add new empty - _setting.add(Array(CharTypeData.entries.size) { false }) - keepMenu = true - } - - it.itemId < 100 -> { - // remove graph - _setting.removeAt(it.itemId) - keepMenu = true - } - - else -> { - val graphNumber = it.itemId / 100 - 1 - val item = it.itemId % 100 - _setting[graphNumber][item] = !it.isChecked - keepMenu = true - } - } - } catch (exception: Exception) { - fabricPrivacy.logException(exception) + popup.showAsDropDown(v) + } + } + + private fun createCustomMenuItemView(context: Context, m: CharTypeData, rowIndex: Int, layout: GridLayout) { + var layoutParamsLabel = GridLayout.LayoutParams(GridLayout.spec(rowIndex, 1), GridLayout.spec(0, 1)) + val textView = TextView(context).also { + it.text = formatedText(m) + } + layout.addView(textView, layoutParamsLabel) + + val checkBoxes = mutableListOf() + + // Create one or 4 checkbox + for (i in 1..4) { + val item = if (m.secondary || i == 4) CheckBox(context) else TextView(context) + item.id = i + if (item is CheckBox) { + if (m.primary) + item.isChecked = _setting[0][m.ordinal] + if (m.secondary) + item.isChecked = _setting[i][m.ordinal] + checkBoxes.add(item) + } + layoutParamsLabel = GridLayout.LayoutParams(GridLayout.spec(rowIndex, 1), GridLayout.spec(i, 1)) + layout.addView(item, layoutParamsLabel) + } + + val checkBoxListener = CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> + // Update other Checkboxes on same row to allow a curve to only one subgraph + if (isChecked) { + checkBoxes.forEach { checkBox -> + if (checkBox != buttonView) { + if (checkBox is CheckBox) checkBox.isChecked = false } } - storeGraphConfig() - setupChartMenu(context, chartButton) - if (keepMenu) - chartButton.performClick() - rxBus.send(EventRefreshOverview("OnMenuItemClickListener", now = true)) - return@setOnMenuItemClickListener true } - chartButton.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp) - popup.setOnDismissListener { chartButton.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp) } - popup.show() + if (m.primary) + _setting[0][m.ordinal] = checkBoxes[0].isChecked + else { + checkBoxes.forEach { checkBox -> + _setting[checkBox.id][m.ordinal] = checkBox.isChecked + } + } + storeGraphConfig() + rxBus.send(EventRefreshOverview("OnMenuItemClickListener", now = true)) + } + + checkBoxes.forEach { checkBox -> + if (checkBox is CheckBox) checkBox.setOnCheckedChangeListener(checkBoxListener) + } + } + private fun formatedText(m: CharTypeData): SpannableString { + return SpannableString(" ${rh.gs(m.nameId)} ").also { + it.setSpan(ForegroundColorSpan(rh.gac(m.attrTextId)), 0, it.length, 0) + it.setSpan(BackgroundColorSpan(rh.gac(m.attrId)), 0, it.length, 0) } } From 8fdc608d1fbe0ae82e6ec31deebd43ecfae6cbf9 Mon Sep 17 00:00:00 2001 From: Philoul Date: Sun, 12 May 2024 17:20:18 +0200 Subject: [PATCH 07/12] Better management of Primary/Secondary graphs --- .../main/general/overview/OverviewMenusImpl.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt index 864f078cb9c..df8de494f95 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt @@ -143,7 +143,7 @@ class OverviewMenusImpl @Inject constructor( var insert = true if (m == CharTypeData.PRE) insert = predictionsAvailable if (insert && m.primary) { - createCustomMenuItemView(v.context, m, itemRow, layout) + createCustomMenuItemView(v.context, m, itemRow, layout, true) itemRow++ } } @@ -171,7 +171,7 @@ class OverviewMenusImpl @Inject constructor( var insert = true if (m == CharTypeData.DEVSLOPE) insert = config.isDev() if (insert && m.secondary) { - createCustomMenuItemView(v.context, m, itemRow, layout) + createCustomMenuItemView(v.context, m, itemRow, layout, false) itemRow++ } } @@ -191,7 +191,7 @@ class OverviewMenusImpl @Inject constructor( } } - private fun createCustomMenuItemView(context: Context, m: CharTypeData, rowIndex: Int, layout: GridLayout) { + private fun createCustomMenuItemView(context: Context, m: CharTypeData, rowIndex: Int, layout: GridLayout, primary: Boolean) { var layoutParamsLabel = GridLayout.LayoutParams(GridLayout.spec(rowIndex, 1), GridLayout.spec(0, 1)) val textView = TextView(context).also { it.text = formatedText(m) @@ -202,12 +202,12 @@ class OverviewMenusImpl @Inject constructor( // Create one or 4 checkbox for (i in 1..4) { - val item = if (m.secondary || i == 4) CheckBox(context) else TextView(context) + val item = if (!primary || i == 4) CheckBox(context) else TextView(context) item.id = i if (item is CheckBox) { - if (m.primary) + if (primary) item.isChecked = _setting[0][m.ordinal] - if (m.secondary) + else item.isChecked = _setting[i][m.ordinal] checkBoxes.add(item) } From 7d1883773d6714d90162e147ebfdfde5ff4d9f01 Mon Sep 17 00:00:00 2001 From: Philoul Date: Mon, 13 May 2024 21:09:24 +0200 Subject: [PATCH 08/12] Improve menu management --- .../general/overview/OverviewMenusImpl.kt | 56 +++++++++++++------ 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt index df8de494f95..9f00c1900d0 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt @@ -1,15 +1,20 @@ package app.aaps.plugins.main.general.overview +import android.app.ActionBar.LayoutParams import android.content.Context +import android.text.Layout import android.text.SpannableString import android.text.style.BackgroundColorSpan import android.text.style.ForegroundColorSpan import android.view.Gravity import android.view.View +import android.view.ViewGroup import android.widget.CheckBox import android.widget.CompoundButton +import android.widget.HorizontalScrollView import android.widget.ImageButton import android.widget.PopupWindow +import android.widget.ScrollView import android.widget.TextView import androidx.annotation.AttrRes import androidx.annotation.StringRes @@ -83,21 +88,25 @@ class OverviewMenusImpl @Inject constructor( } private var _setting: MutableList> = ArrayList() + get() = field.also { + while (it.size < MAX_GRAPHS) + it.add(Array(CharTypeData.entries.size) { false }) + } override val setting: List> @Synchronized get() = if (!preferences.simpleMode) // implicitly does a list copy and update according to number of graphs _setting.toMutableList().also { - while(_setting.size < MAX_GRAPHS) - _setting.add(Array(CharTypeData.entries.size) { false }) + for (i in it.size - 1 downTo 1) { + if (!it[i].any { it }) + it.removeAt(i) + } } else listOf( arrayOf(true, true, true, false, false, false, false, false, false, false, false, false, false, false), arrayOf(false, false, false, false, true, false, false, false, false, false, false, false, false, false), - arrayOf(false, false, false, false, false, true, false, false, false, false, false, false, false, false), - arrayOf(false, false, false, false, false, false, false, false, false, false, false, false, false, false), - arrayOf(false, false, false, false, false, false, false, false, false, false, false, false, false, false) + arrayOf(false, false, false, false, false, true, false, false, false, false, false, false, false, false) ) @Synchronized @@ -135,8 +144,15 @@ class OverviewMenusImpl @Inject constructor( else -> false } val popup = PopupWindow(v.context) + val scrollView = ScrollView(context) // required to be able to scroll menu on low res screen + val horizontalScrollView = HorizontalScrollView(context) // Workaround because I was not able to manage first column width for long labels + horizontalScrollView.addView(scrollView) + val layout = GridLayout(v.context) - layout.columnCount = 5 + layout.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) // not sure it works + + scrollView.addView(layout) + layout.columnCount = MAX_GRAPHS // instert primary items CharTypeData.entries.forEach { m -> @@ -152,9 +168,10 @@ class OverviewMenusImpl @Inject constructor( var layoutParamsLabel = GridLayout.LayoutParams(GridLayout.spec(itemRow, 1), GridLayout.spec(0, 1)) val textView = TextView(context).also { it.text = " ${rh.gs(R.string.graph_menu_divider_header)}" + it.maxLines = 3 // don't works currently } layout.addView(textView, layoutParamsLabel) - for (i in 1..4) { + for (i in 1..(MAX_GRAPHS - 1)) { val item = TextView(context).also { it.gravity = Gravity.CENTER it.text = "$i" @@ -176,14 +193,19 @@ class OverviewMenusImpl @Inject constructor( } } - popup.contentView = layout + popup.contentView = horizontalScrollView // Permettre la fermeture de la PopupWindow en touchant en dehors popup.isOutsideTouchable = true popup.isFocusable = true - popup.setOnDismissListener { - // todo: reorganize graph to remove empty graphs in the middle - + popup.setOnDismissListener { // remove empty graphs + _setting.let { + for (i in it.size - 1 downTo 1) { + if (!it[i].any { it }) + it.removeAt(i) + } + } + storeGraphConfig() rxBus.send(EventRefreshOverview("OnMenuItemClickListener", now = true)) } @@ -191,18 +213,19 @@ class OverviewMenusImpl @Inject constructor( } } - private fun createCustomMenuItemView(context: Context, m: CharTypeData, rowIndex: Int, layout: GridLayout, primary: Boolean) { + private fun createCustomMenuItemView(context: Context, m: CharTypeData, rowIndex: Int, layout: GridLayout, primary: Boolean) { var layoutParamsLabel = GridLayout.LayoutParams(GridLayout.spec(rowIndex, 1), GridLayout.spec(0, 1)) val textView = TextView(context).also { it.text = formatedText(m) + it.maxLines = 3 // don't works currently } layout.addView(textView, layoutParamsLabel) val checkBoxes = mutableListOf() // Create one or 4 checkbox - for (i in 1..4) { - val item = if (!primary || i == 4) CheckBox(context) else TextView(context) + for (i in 1..(MAX_GRAPHS - 1)) { + val item = if (!primary || i == (MAX_GRAPHS - 1)) CheckBox(context) else TextView(context) item.id = i if (item is CheckBox) { if (primary) @@ -220,7 +243,7 @@ class OverviewMenusImpl @Inject constructor( if (isChecked) { checkBoxes.forEach { checkBox -> if (checkBox != buttonView) { - if (checkBox is CheckBox) checkBox.isChecked = false + checkBox.isChecked = false } } } @@ -236,9 +259,10 @@ class OverviewMenusImpl @Inject constructor( } checkBoxes.forEach { checkBox -> - if (checkBox is CheckBox) checkBox.setOnCheckedChangeListener(checkBoxListener) + checkBox.setOnCheckedChangeListener(checkBoxListener) } } + private fun formatedText(m: CharTypeData): SpannableString { return SpannableString(" ${rh.gs(m.nameId)} ").also { it.setSpan(ForegroundColorSpan(rh.gac(m.attrTextId)), 0, it.length, 0) From c8cf4e57222d398304f22676e901808ac92e8776 Mon Sep 17 00:00:00 2001 From: Philoul Date: Thu, 16 May 2024 10:31:47 +0200 Subject: [PATCH 09/12] Fix SubGraph initialisation and cleaning --- .../main/general/overview/OverviewMenusImpl.kt | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt index 9f00c1900d0..b608fcf0af3 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt @@ -1,8 +1,6 @@ package app.aaps.plugins.main.general.overview -import android.app.ActionBar.LayoutParams import android.content.Context -import android.text.Layout import android.text.SpannableString import android.text.style.BackgroundColorSpan import android.text.style.ForegroundColorSpan @@ -125,12 +123,10 @@ class OverviewMenusImpl @Inject constructor( // reset when new CharType added for (s in _setting) if (s.size != OverviewMenus.CharType.entries.size) { - _setting = ArrayList() - _setting.add(Array(OverviewMenus.CharType.entries.size) { CharTypeData.entries[it].enabledByDefault }) + _setting = ArrayList>().also { it.add(Array(OverviewMenus.CharType.entries.size) { CharTypeData.entries[it].enabledByDefault }) } } } else { - _setting = ArrayList() - _setting.add(Array(OverviewMenus.CharType.entries.size) { CharTypeData.entries[it].enabledByDefault }) + _setting = ArrayList>().also { it.add(Array(OverviewMenus.CharType.entries.size) { CharTypeData.entries[it].enabledByDefault }) } } } @@ -201,7 +197,7 @@ class OverviewMenusImpl @Inject constructor( popup.setOnDismissListener { // remove empty graphs _setting.let { for (i in it.size - 1 downTo 1) { - if (!it[i].any { it }) + if (!isSecondary(it[i])) it.removeAt(i) } } @@ -213,6 +209,8 @@ class OverviewMenusImpl @Inject constructor( } } + fun isSecondary(graphArray: Array): Boolean = graphArray.filterIndexed { index, _ -> CharTypeData.entries[index].secondary }.reduce { acc, b -> acc || b } + private fun createCustomMenuItemView(context: Context, m: CharTypeData, rowIndex: Int, layout: GridLayout, primary: Boolean) { var layoutParamsLabel = GridLayout.LayoutParams(GridLayout.spec(rowIndex, 1), GridLayout.spec(0, 1)) val textView = TextView(context).also { From 340f7cf06428812638d20ccc775871c736b0830e Mon Sep 17 00:00:00 2001 From: Philoul Date: Thu, 16 May 2024 10:38:05 +0200 Subject: [PATCH 10/12] Remove Long press Menu in OverView --- .../main/general/overview/OverviewFragment.kt | 40 +++++-------------- 1 file changed, 10 insertions(+), 30 deletions(-) diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt index a5b5b35907e..87bf5882119 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt @@ -16,7 +16,6 @@ import android.os.HandlerThread import android.util.DisplayMetrics import android.util.TypedValue import android.view.LayoutInflater -import android.view.Menu import android.view.View import android.view.View.OnLongClickListener import android.view.ViewGroup @@ -24,7 +23,6 @@ import android.widget.LinearLayout import android.widget.RelativeLayout import android.graphics.Typeface import android.widget.TextView -import androidx.appcompat.widget.PopupMenu import androidx.core.text.toSpanned import androidx.recyclerview.widget.LinearLayoutManager import app.aaps.core.data.configuration.Constants @@ -232,42 +230,24 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList 24 -> binding.graphsLayout.graphScale24h.isChecked = true } - binding.graphsLayout.chartMenuButton.setOnLongClickListener { v: View -> - val popup = PopupMenu(v.context, v) - popup.menu.add(Menu.NONE, 6, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 6, 6)) - popup.menu.add(Menu.NONE, 12, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 12, 12)) - popup.menu.add(Menu.NONE, 18, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 18, 18)) - popup.menu.add(Menu.NONE, 24, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 24, 24)) - popup.setOnMenuItemClickListener { - // id == Range to display ... - sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, it.itemId) - rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) - return@setOnMenuItemClickListener true - } - binding.graphsLayout.chartMenuButton.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp) - popup.setOnDismissListener { binding.graphsLayout.chartMenuButton.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp) } - popup.show() - false - } - binding.graphsLayout.graphScale6h.setOnClickListener { sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, 6) - resetScaleText() + updateScaleButtons() rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) } binding.graphsLayout.graphScale12h.setOnClickListener { sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, 12) - resetScaleText() + updateScaleButtons() rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) } binding.graphsLayout.graphScale18h.setOnClickListener { sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, 18) - resetScaleText() + updateScaleButtons() rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) } binding.graphsLayout.graphScale24h.setOnClickListener { sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, 24) - resetScaleText() + updateScaleButtons() rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) } @@ -292,17 +272,17 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList binding.infoLayout.apsMode.setOnLongClickListener(this) } - fun resetScaleText() { + fun updateScaleButtons() { binding.graphsLayout.graphScale6h.setTypeface(null, Typeface.NORMAL) binding.graphsLayout.graphScale12h.setTypeface(null, Typeface.NORMAL) binding.graphsLayout.graphScale18h.setTypeface(null, Typeface.NORMAL) binding.graphsLayout.graphScale24h.setTypeface(null, Typeface.NORMAL) when (sp.getInt(app.aaps.core.utils.R.string.key_rangetodisplay,6)) { - 6 -> binding.graphsLayout.graphScale6h.setTypeface(null, Typeface.BOLD) - 12 -> binding.graphsLayout.graphScale12h.setTypeface(null, Typeface.BOLD) - 18 -> binding.graphsLayout.graphScale18h.setTypeface(null, Typeface.BOLD) - 24 -> binding.graphsLayout.graphScale24h.setTypeface(null, Typeface.BOLD) + 6 -> binding.graphsLayout.graphScale6h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } + 12 -> binding.graphsLayout.graphScale12h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } + 18 -> binding.graphsLayout.graphScale18h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } + 24 -> binding.graphsLayout.graphScale24h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } } } @@ -416,7 +396,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList if (!config.appInitialized) return runOnUiThread { _binding ?: return@runOnUiThread - resetScaleText() + updateScaleButtons() updateTime() updateSensitivity() updateGraph() From 7f8eb39858c773a94fce2fc63db3739bba01b67e Mon Sep 17 00:00:00 2001 From: Philoul Date: Thu, 16 May 2024 10:39:10 +0200 Subject: [PATCH 11/12] Harmonize HiwtoryBrowser rescale buttons with overview --- .../aaps/activities/HistoryBrowseActivity.kt | 52 ++++---------- .../res/layout/activity_historybrowse.xml | 70 +++++++++---------- 2 files changed, 49 insertions(+), 73 deletions(-) diff --git a/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt b/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt index ec573d2b835..833a9ddefe1 100644 --- a/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt +++ b/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt @@ -2,15 +2,13 @@ package app.aaps.activities import android.annotation.SuppressLint import android.content.Context +import android.graphics.Typeface import android.os.Bundle import android.util.DisplayMetrics -import android.view.Menu -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import android.widget.RelativeLayout import android.widget.TextView -import androidx.appcompat.widget.PopupMenu import app.aaps.core.data.time.T import app.aaps.core.interfaces.configuration.Config import app.aaps.core.interfaces.logging.AAPSLogger @@ -131,47 +129,27 @@ class HistoryBrowseActivity : TranslatedDaggerAppCompatActivity() { .show(supportFragmentManager, "history_date_picker") } - binding.chartMenuButton.setOnLongClickListener { v: View -> - val popup = PopupMenu(v.context, v) - popup.menu.add(Menu.NONE, 6, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 6, 6)) - popup.menu.add(Menu.NONE, 12, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 12, 12)) - popup.menu.add(Menu.NONE, 18, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 18, 18)) - popup.menu.add(Menu.NONE, 24, Menu.NONE, rh.gq(app.aaps.core.ui.R.plurals.hours, 24, 24)) - popup.setOnMenuItemClickListener { - // id == Range to display ... - rangeToDisplay = it.itemId - setTime(historyBrowserData.overviewData.fromTime) - loadAll("rangeChange") - return@setOnMenuItemClickListener true - } - binding.chartMenuButton.setImageResource(app.aaps.plugins.main.R.drawable.ic_arrow_drop_up_white_24dp) - popup.setOnDismissListener { binding.chartMenuButton.setImageResource(app.aaps.plugins.main.R.drawable.ic_arrow_drop_down_white_24dp) } - popup.show() - false - } - - binding.graphScale6h.setOnClickListener { rangeToDisplay = 6 - resetScaleText() + updateScaleButtons() setTime(historyBrowserData.overviewData.fromTime) loadAll("rangeChange") } binding.graphScale12h.setOnClickListener { rangeToDisplay = 12 - resetScaleText() + updateScaleButtons() setTime(historyBrowserData.overviewData.fromTime) loadAll("rangeChange") } binding.graphScale18h.setOnClickListener { rangeToDisplay = 18 - resetScaleText() + updateScaleButtons() setTime(historyBrowserData.overviewData.fromTime) loadAll("rangeChange") } binding.graphScale24h.setOnClickListener { rangeToDisplay = 24 - resetScaleText() + updateScaleButtons() setTime(historyBrowserData.overviewData.fromTime) loadAll("rangeChange") } @@ -287,17 +265,17 @@ class HistoryBrowseActivity : TranslatedDaggerAppCompatActivity() { } } + fun updateScaleButtons() { + binding.graphScale6h.setTypeface(null, Typeface.NORMAL) + binding.graphScale12h.setTypeface(null, Typeface.NORMAL) + binding.graphScale18h.setTypeface(null, Typeface.NORMAL) + binding.graphScale24h.setTypeface(null, Typeface.NORMAL) - private fun resetScaleText() { - binding.graphScale6h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Small) - binding.graphScale12h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Small) - binding.graphScale18h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Small) - binding.graphScale24h.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Small) when (rangeToDisplay) { - 6 -> binding.graphScale6h.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.highColor)) - 12 -> binding.graphScale12h.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.highColor)) - 18 -> binding.graphScale18h.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.highColor)) - 24 -> binding.graphScale24h.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.highColor)) + 6 -> binding.graphScale6h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } + 12 -> binding.graphScale12h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } + 18 -> binding.graphScale18h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } + 24 -> binding.graphScale24h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } } } @@ -358,7 +336,7 @@ class HistoryBrowseActivity : TranslatedDaggerAppCompatActivity() { aapsLogger.debug(LTag.UI, "updateGui $from") updateDate() - resetScaleText() + updateScaleButtons() val pump = activePlugin.activePump val graphData = GraphData(injector, binding.bgGraph, historyBrowserData.overviewData) val menuChartSettings = overviewMenus.setting diff --git a/app/src/main/res/layout/activity_historybrowse.xml b/app/src/main/res/layout/activity_historybrowse.xml index 0b277450569..4af5dddd238 100644 --- a/app/src/main/res/layout/activity_historybrowse.xml +++ b/app/src/main/res/layout/activity_historybrowse.xml @@ -69,74 +69,72 @@ android:layout_height="wrap_content" android:orientation="vertical"> - + - - + - + style="@style/Widget.MaterialComponents.Chip.Choice" /> - + style="@style/Widget.MaterialComponents.Chip.Choice" /> - + style="@style/Widget.MaterialComponents.Chip.Choice" /> - + style="@style/Widget.MaterialComponents.Chip.Choice" /> - + + + + + + + Date: Mon, 20 May 2024 11:49:33 +0200 Subject: [PATCH 12/12] Replace 4 rescale buttons by popup menu on the left --- .../aaps/activities/HistoryBrowseActivity.kt | 75 ++++++++---------- .../res/layout/activity_historybrowse.xml | 74 +++++------------- .../core/interfaces/overview/OverviewMenus.kt | 3 +- .../main/general/overview/OverviewFragment.kt | 76 ++++++++---------- .../general/overview/OverviewMenusImpl.kt | 17 ++-- .../res/layout/overview_graphs_layout.xml | 78 ++++++------------- plugins/main/src/main/res/values/strings.xml | 5 ++ 7 files changed, 122 insertions(+), 206 deletions(-) diff --git a/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt b/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt index 833a9ddefe1..70f29b67bae 100644 --- a/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt +++ b/app/src/main/kotlin/app/aaps/activities/HistoryBrowseActivity.kt @@ -2,13 +2,15 @@ package app.aaps.activities import android.annotation.SuppressLint import android.content.Context -import android.graphics.Typeface import android.os.Bundle import android.util.DisplayMetrics +import android.view.Menu +import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import android.widget.RelativeLayout import android.widget.TextView +import androidx.appcompat.widget.PopupMenu import app.aaps.core.data.time.T import app.aaps.core.interfaces.configuration.Config import app.aaps.core.interfaces.logging.AAPSLogger @@ -34,6 +36,7 @@ import app.aaps.core.ui.activities.TranslatedDaggerAppCompatActivity import app.aaps.core.ui.extensions.toVisibility import app.aaps.core.ui.extensions.toVisibilityKeepSpace import app.aaps.databinding.ActivityHistorybrowseBinding +import app.aaps.plugins.main.R import app.aaps.plugins.main.general.overview.graphData.GraphData import com.google.android.material.datepicker.MaterialDatePicker import com.jjoe64.graphview.GraphView @@ -129,31 +132,6 @@ class HistoryBrowseActivity : TranslatedDaggerAppCompatActivity() { .show(supportFragmentManager, "history_date_picker") } - binding.graphScale6h.setOnClickListener { - rangeToDisplay = 6 - updateScaleButtons() - setTime(historyBrowserData.overviewData.fromTime) - loadAll("rangeChange") - } - binding.graphScale12h.setOnClickListener { - rangeToDisplay = 12 - updateScaleButtons() - setTime(historyBrowserData.overviewData.fromTime) - loadAll("rangeChange") - } - binding.graphScale18h.setOnClickListener { - rangeToDisplay = 18 - updateScaleButtons() - setTime(historyBrowserData.overviewData.fromTime) - loadAll("rangeChange") - } - binding.graphScale24h.setOnClickListener { - rangeToDisplay = 24 - updateScaleButtons() - setTime(historyBrowserData.overviewData.fromTime) - loadAll("rangeChange") - } - val dm = DisplayMetrics() @Suppress("DEPRECATION") if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) @@ -166,7 +144,25 @@ class HistoryBrowseActivity : TranslatedDaggerAppCompatActivity() { binding.bgGraph.gridLabelRenderer?.reloadStyles() binding.bgGraph.gridLabelRenderer?.labelVerticalWidth = axisWidth - overviewMenus.setupChartMenu(context, binding.chartMenuButton) + overviewMenus.setupChartMenu(binding.chartMenuButton) + binding.scaleButton.setOnClickListener { v: View -> + val popup = PopupMenu(v.context, v) + popup.menu.add(Menu.NONE, 6, Menu.NONE, rh.gs(R.string.graph_long_scale_6h)) + popup.menu.add(Menu.NONE, 12, Menu.NONE, rh.gs(R.string.graph_long_scale_12h)) + popup.menu.add(Menu.NONE, 18, Menu.NONE, rh.gs(R.string.graph_long_scale_18h)) + popup.menu.add(Menu.NONE, 24, Menu.NONE, rh.gs(R.string.graph_long_scale_24h)) + popup.setOnMenuItemClickListener { + // id == Range to display ... + rangeToDisplay = it.itemId + updateScaletext() + rxBus.send(EventScale(rangeToDisplay)) + return@setOnMenuItemClickListener true + } + binding.scaleButton.setCompoundDrawablesWithIntrinsicBounds(null, null, rh.gd(R.drawable.ic_arrow_drop_up_white_24dp), null) + popup.setOnDismissListener { binding.scaleButton.setCompoundDrawablesWithIntrinsicBounds(null, null, rh.gd(R.drawable.ic_arrow_drop_down_white_24dp), null) } + popup.show() + false + } prepareGraphsIfNeeded(overviewMenus.setting.size) savedInstanceState?.let { bundle -> rangeToDisplay = bundle.getInt("rangeToDisplay", 0) @@ -265,20 +261,6 @@ class HistoryBrowseActivity : TranslatedDaggerAppCompatActivity() { } } - fun updateScaleButtons() { - binding.graphScale6h.setTypeface(null, Typeface.NORMAL) - binding.graphScale12h.setTypeface(null, Typeface.NORMAL) - binding.graphScale18h.setTypeface(null, Typeface.NORMAL) - binding.graphScale24h.setTypeface(null, Typeface.NORMAL) - - when (rangeToDisplay) { - 6 -> binding.graphScale6h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } - 12 -> binding.graphScale12h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } - 18 -> binding.graphScale18h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } - 24 -> binding.graphScale24h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } - } - } - @Suppress("SameParameterValue") private fun loadAll(from: String) { updateDate() @@ -331,12 +313,21 @@ class HistoryBrowseActivity : TranslatedDaggerAppCompatActivity() { binding.zoom.text = rangeToDisplay.toString() } + private fun updateScaletext() { + binding.scaleButton.text = when (rangeToDisplay) { + 6 -> rh.gs(R.string.graph_scale_6h) + 12 -> rh.gs(R.string.graph_scale_12h) + 18 -> rh.gs(R.string.graph_scale_18h) + 24 -> rh.gs(R.string.graph_scale_24h) + else -> "" + } + } @SuppressLint("SetTextI18n") fun updateGUI(from: String) { aapsLogger.debug(LTag.UI, "updateGui $from") updateDate() - updateScaleButtons() + updateScaletext() val pump = activePlugin.activePump val graphData = GraphData(injector, binding.bgGraph, historyBrowserData.overviewData) val menuChartSettings = overviewMenus.setting diff --git a/app/src/main/res/layout/activity_historybrowse.xml b/app/src/main/res/layout/activity_historybrowse.xml index 4af5dddd238..8e62729aeca 100644 --- a/app/src/main/res/layout/activity_historybrowse.xml +++ b/app/src/main/res/layout/activity_historybrowse.xml @@ -69,72 +69,34 @@ android:layout_height="wrap_content" android:orientation="vertical"> - + + + - - - - - - - - - - - + android:layout_marginStart="35dp" + android:textAllCaps="false" + android:layout_alignParentStart="true" + android:padding = "0dp" + android:drawableRight="@drawable/ic_arrow_drop_down_white_24dp" + android:contentDescription="@string/a11y_graph_scale" /> - - - - - - > fun loadGraphConfig() - fun setupChartMenu(context: Context, chartButton: ImageButton) + fun setupChartMenu(chartButton: ImageButton) fun enabledTypes(graph: Int): String fun isEnabledIn(type: CharType): Int } diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt index 87bf5882119..d23dc490a14 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt @@ -16,13 +16,14 @@ import android.os.HandlerThread import android.util.DisplayMetrics import android.util.TypedValue import android.view.LayoutInflater +import android.view.Menu import android.view.View import android.view.View.OnLongClickListener import android.view.ViewGroup import android.widget.LinearLayout import android.widget.RelativeLayout -import android.graphics.Typeface import android.widget.TextView +import androidx.appcompat.widget.PopupMenu import androidx.core.text.toSpanned import androidx.recyclerview.widget.LinearLayoutManager import app.aaps.core.data.configuration.Constants @@ -222,37 +223,30 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList false } - val selectedScale = sp.getInt(app.aaps.core.utils.R.string.key_rangetodisplay, 6) - when (selectedScale) { - 6 -> binding.graphsLayout.graphScale6h.isChecked = true - 12 -> binding.graphsLayout.graphScale12h.isChecked = true - 18 -> binding.graphsLayout.graphScale18h.isChecked = true - 24 -> binding.graphsLayout.graphScale24h.isChecked = true - } - - binding.graphsLayout.graphScale6h.setOnClickListener { - sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, 6) - updateScaleButtons() - rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) - } - binding.graphsLayout.graphScale12h.setOnClickListener { - sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, 12) - updateScaleButtons() - rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) - } - binding.graphsLayout.graphScale18h.setOnClickListener { - sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, 18) - updateScaleButtons() - rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) - } - binding.graphsLayout.graphScale24h.setOnClickListener { - sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, 24) - updateScaleButtons() - rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) + prepareGraphsIfNeeded(overviewMenus.setting.size) + overviewMenus.setupChartMenu(binding.graphsLayout.chartMenuButton) + updateScaletext() + + + binding.graphsLayout.scaleButton.setOnClickListener { v: View -> + val popup = PopupMenu(v.context, v) + popup.menu.add(Menu.NONE, 6, Menu.NONE, rh.gs(R.string.graph_long_scale_6h)) + popup.menu.add(Menu.NONE, 12, Menu.NONE, rh.gs(R.string.graph_long_scale_12h)) + popup.menu.add(Menu.NONE, 18, Menu.NONE, rh.gs(R.string.graph_long_scale_18h)) + popup.menu.add(Menu.NONE, 24, Menu.NONE, rh.gs(R.string.graph_long_scale_24h)) + popup.setOnMenuItemClickListener { + // id == Range to display ... + sp.putInt(app.aaps.core.utils.R.string.key_rangetodisplay, it.itemId) + updateScaletext() + rxBus.send(EventPreferenceChange(rh.gs(app.aaps.core.utils.R.string.key_rangetodisplay))) + return@setOnMenuItemClickListener true + } + binding.graphsLayout.scaleButton.setCompoundDrawablesWithIntrinsicBounds(null, null, rh.gd(R.drawable.ic_arrow_drop_up_white_24dp), null) + popup.setOnDismissListener { binding.graphsLayout.scaleButton.setCompoundDrawablesWithIntrinsicBounds(null, null, rh.gd(R.drawable.ic_arrow_drop_down_white_24dp), null) } + popup.show() + false } - prepareGraphsIfNeeded(overviewMenus.setting.size) - context?.let { overviewMenus.setupChartMenu(it, binding.graphsLayout.chartMenuButton) } binding.graphsLayout.chartMenuButton.visibility = preferences.simpleMode.not().toVisibility() binding.activeProfile.setOnClickListener(this) @@ -272,17 +266,15 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList binding.infoLayout.apsMode.setOnLongClickListener(this) } - fun updateScaleButtons() { - binding.graphsLayout.graphScale6h.setTypeface(null, Typeface.NORMAL) - binding.graphsLayout.graphScale12h.setTypeface(null, Typeface.NORMAL) - binding.graphsLayout.graphScale18h.setTypeface(null, Typeface.NORMAL) - binding.graphsLayout.graphScale24h.setTypeface(null, Typeface.NORMAL) - - when (sp.getInt(app.aaps.core.utils.R.string.key_rangetodisplay,6)) { - 6 -> binding.graphsLayout.graphScale6h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } - 12 -> binding.graphsLayout.graphScale12h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } - 18 -> binding.graphsLayout.graphScale18h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } - 24 -> binding.graphsLayout.graphScale24h.apply { setTypeface(null, Typeface.BOLD); isChecked = true } + + private fun updateScaletext() { + val selectedScale = sp.getInt(app.aaps.core.utils.R.string.key_rangetodisplay, 6) + binding.graphsLayout.scaleButton.text = when (selectedScale) { + 6 -> rh.gs(R.string.graph_scale_6h) + 12 -> rh.gs(R.string.graph_scale_12h) + 18 -> rh.gs(R.string.graph_scale_18h) + 24 -> rh.gs(R.string.graph_scale_24h) + else -> "" } } @@ -396,7 +388,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList if (!config.appInitialized) return runOnUiThread { _binding ?: return@runOnUiThread - updateScaleButtons() + updateScaletext() updateTime() updateSensitivity() updateGraph() diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt index b608fcf0af3..4d58fa90329 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt @@ -130,18 +130,18 @@ class OverviewMenusImpl @Inject constructor( } } - override fun setupChartMenu(context: Context, chartButton: ImageButton) { - var itemRow = 0 + override fun setupChartMenu(chartButton: ImageButton) { chartButton.setOnClickListener { v: View -> + var itemRow = 0 val predictionsAvailable: Boolean = when { config.APS -> loop.lastRun?.request?.hasPredictions ?: false config.NSCLIENT -> true else -> false } val popup = PopupWindow(v.context) - val scrollView = ScrollView(context) // required to be able to scroll menu on low res screen - val horizontalScrollView = HorizontalScrollView(context) // Workaround because I was not able to manage first column width for long labels + val scrollView = ScrollView(v.context) // required to be able to scroll menu on low res screen + val horizontalScrollView = HorizontalScrollView(v.context) // Workaround because I was not able to manage first column width for long labels horizontalScrollView.addView(scrollView) val layout = GridLayout(v.context) @@ -162,13 +162,13 @@ class OverviewMenusImpl @Inject constructor( // insert hearder row var layoutParamsLabel = GridLayout.LayoutParams(GridLayout.spec(itemRow, 1), GridLayout.spec(0, 1)) - val textView = TextView(context).also { + val textView = TextView(v.context).also { it.text = " ${rh.gs(R.string.graph_menu_divider_header)}" it.maxLines = 3 // don't works currently } layout.addView(textView, layoutParamsLabel) for (i in 1..(MAX_GRAPHS - 1)) { - val item = TextView(context).also { + val item = TextView(v.context).also { it.gravity = Gravity.CENTER it.text = "$i" } @@ -188,13 +188,12 @@ class OverviewMenusImpl @Inject constructor( itemRow++ } } - popup.contentView = horizontalScrollView // Permettre la fermeture de la PopupWindow en touchant en dehors popup.isOutsideTouchable = true popup.isFocusable = true - popup.setOnDismissListener { // remove empty graphs + chartButton.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp) _setting.let { for (i in it.size - 1 downTo 1) { if (!isSecondary(it[i])) @@ -204,7 +203,7 @@ class OverviewMenusImpl @Inject constructor( storeGraphConfig() rxBus.send(EventRefreshOverview("OnMenuItemClickListener", now = true)) } - + chartButton.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp) popup.showAsDropDown(v) } } diff --git a/plugins/main/src/main/res/layout/overview_graphs_layout.xml b/plugins/main/src/main/res/layout/overview_graphs_layout.xml index ea5db6414ef..e87f8101d93 100644 --- a/plugins/main/src/main/res/layout/overview_graphs_layout.xml +++ b/plugins/main/src/main/res/layout/overview_graphs_layout.xml @@ -6,62 +6,6 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - - - - - - - - - +