From 513020d42e159e3e685223a5b314c3a237d226be Mon Sep 17 00:00:00 2001 From: Norbel AMBANUMBEN Date: Wed, 7 Feb 2024 17:30:54 +0100 Subject: [PATCH] Updated auto run preferences --- .../ooniprobe/activity/OverviewActivity.java | 15 ++-- .../OverviewTestsExpandableListViewAdapter.kt | 15 ++++ .../activity/overview/OverviewViewModel.kt | 48 +++++++++--- .../ooniprobe/common/OONIDescriptor.kt | 75 +++++++++++++------ .../common/PreferenceManagerExtension.kt | 3 + 5 files changed, 120 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/org/openobservatory/ooniprobe/activity/OverviewActivity.java b/app/src/main/java/org/openobservatory/ooniprobe/activity/OverviewActivity.java index 22654b96b..a71c368f8 100644 --- a/app/src/main/java/org/openobservatory/ooniprobe/activity/OverviewActivity.java +++ b/app/src/main/java/org/openobservatory/ooniprobe/activity/OverviewActivity.java @@ -3,6 +3,7 @@ import static org.openobservatory.ooniprobe.activity.overview.OverviewViewModel.SELECT_ALL; import static org.openobservatory.ooniprobe.activity.overview.OverviewViewModel.SELECT_NONE; import static org.openobservatory.ooniprobe.activity.overview.OverviewViewModel.SELECT_SOME; +import static org.openobservatory.ooniprobe.common.PreferenceManagerExtensionKt.resolveStatus; import android.content.Context; import android.content.Intent; @@ -110,12 +111,16 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { } }); - if (adapter.isSelectedAllItems()) { - binding.switchTests.setCheckedState(MaterialCheckBox.STATE_CHECKED); - } else if (adapter.isNotSelectedAnyGroupItem()) { - binding.switchTests.setCheckedState(MaterialCheckBox.STATE_UNCHECKED); + if (descriptor.getName().equals(OONITests.EXPERIMENTAL.getLabel())) { + binding.switchTests.setChecked(resolveStatus(preferenceManager, descriptor.getName(), descriptor.preferencePrefix(), true)); } else { - binding.switchTests.setCheckedState(MaterialCheckBox.STATE_INDETERMINATE); + if (adapter.isSelectedAllItems()) { + binding.switchTests.setCheckedState(MaterialCheckBox.STATE_CHECKED); + } else if (adapter.isNotSelectedAnyGroupItem()) { + binding.switchTests.setCheckedState(MaterialCheckBox.STATE_UNCHECKED); + } else { + binding.switchTests.setCheckedState(MaterialCheckBox.STATE_INDETERMINATE); + } } // Expand all groups for (int i = 0; i < adapter.getGroupCount(); i++) { diff --git a/app/src/main/java/org/openobservatory/ooniprobe/activity/overview/OverviewTestsExpandableListViewAdapter.kt b/app/src/main/java/org/openobservatory/ooniprobe/activity/overview/OverviewTestsExpandableListViewAdapter.kt index 87dd65b74..04ff44aea 100644 --- a/app/src/main/java/org/openobservatory/ooniprobe/activity/overview/OverviewTestsExpandableListViewAdapter.kt +++ b/app/src/main/java/org/openobservatory/ooniprobe/activity/overview/OverviewTestsExpandableListViewAdapter.kt @@ -45,6 +45,7 @@ class OverviewTestsExpandableListViewAdapter( when (viewModel.descriptor.value?.name) { OONITests.EXPERIMENTAL.label -> { view.findViewById(R.id.group_name).text = groupItem.name + view.findViewById(R.id.group_icon).visibility = View.GONE } else -> { @@ -97,6 +98,20 @@ class OverviewTestsExpandableListViewAdapter( groupCheckBox.isChecked = groupItem.selected + /** + * Hide checkbox for experimental tests. + * Experimental tests are not configurable in the settings. + * Tests in this category are not permanent and are subject to change. + * The checkbox is hidden to prevent the user from mistakenly thinking they can be configured. + */ + viewModel.descriptor.value?.run { + if (name == OONITests.EXPERIMENTAL.label) { + groupCheckBox.visibility = View.GONE + } else { + groupCheckBox.visibility = View.VISIBLE + } + } + if (groupItem.inputs?.isNotEmpty() == true) { if (isExpanded) { groupIndicator.setImageResource(R.drawable.expand_less) diff --git a/app/src/main/java/org/openobservatory/ooniprobe/activity/overview/OverviewViewModel.kt b/app/src/main/java/org/openobservatory/ooniprobe/activity/overview/OverviewViewModel.kt index 9384e100a..7725b0496 100644 --- a/app/src/main/java/org/openobservatory/ooniprobe/activity/overview/OverviewViewModel.kt +++ b/app/src/main/java/org/openobservatory/ooniprobe/activity/overview/OverviewViewModel.kt @@ -3,8 +3,8 @@ package org.openobservatory.ooniprobe.activity.overview import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.openobservatory.engine.BaseNettest -import org.openobservatory.ooniprobe.activity.runtests.RunTestsViewModel import org.openobservatory.ooniprobe.common.OONIDescriptor +import org.openobservatory.ooniprobe.common.OONITests import org.openobservatory.ooniprobe.common.PreferenceManager import org.openobservatory.ooniprobe.common.disableTest import org.openobservatory.ooniprobe.common.enableTest @@ -28,22 +28,50 @@ class OverviewViewModel() : ViewModel() { val selectedAllBtnStatus: MutableLiveData = MutableLiveData() init { - selectedAllBtnStatus.postValue(RunTestsViewModel.SELECT_SOME) + selectedAllBtnStatus.postValue(SELECT_SOME) } + + /** + * Set the status of the selected all button. + * This method will also update the preference of the tests based on the selected status. + * For experimental tests, a single button is used to enable/disable all tests. + * @param selectedStatus the status of the selected all button + */ fun setSelectedAllBtnStatus(selectedStatus: String) { selectedAllBtnStatus.postValue(selectedStatus) - when (selectedStatus) { - SELECT_ALL -> { - descriptor.value?.nettests?.forEach { - enableTest(it.name) + descriptor.value?.let { desc -> + + when (selectedStatus) { + SELECT_ALL -> { + when (desc.name) { + OONITests.EXPERIMENTAL.label -> { + enableTest(name = desc.name) + } + + else -> { + descriptor.value?.nettests?.forEach { + enableTest(name = it.name) + } + } + } } - } - SELECT_NONE -> { - descriptor.value?.nettests?.forEach { - disableTest(it.name) + SELECT_NONE -> { + when (desc.name) { + OONITests.EXPERIMENTAL.label -> { + disableTest(name = desc.name) + } + + else -> { + descriptor.value?.nettests?.forEach { + disableTest(name = it.name) + } + } + } } + + else -> {} } } } diff --git a/app/src/main/java/org/openobservatory/ooniprobe/common/OONIDescriptor.kt b/app/src/main/java/org/openobservatory/ooniprobe/common/OONIDescriptor.kt index 1eb488c83..b1f827636 100644 --- a/app/src/main/java/org/openobservatory/ooniprobe/common/OONIDescriptor.kt +++ b/app/src/main/java/org/openobservatory/ooniprobe/common/OONIDescriptor.kt @@ -347,41 +347,74 @@ enum class OONITests( fun autoRunTests(context: Context, preferenceManager: PreferenceManager): List { return ooniDescriptors(context).filter { ooniDescriptor -> - ooniDescriptor.nettests.any { nettest -> - preferenceManager.resolveStatus( - name = nettest.name, + when (ooniDescriptor.name) { + OONITests.EXPERIMENTAL.label -> preferenceManager.resolveStatus( + name = ooniDescriptor.name, prefix = ooniDescriptor.preferencePrefix(), autoRun = true ) - } - }.map { ooniDescriptor -> - DynamicTestSuite( - name = ooniDescriptor.name, - title = ooniDescriptor.title, - shortDescription = ooniDescriptor.shortDescription, - description = ooniDescriptor.description, - icon = ooniDescriptor.getDisplayIcon(context), - icon_24 = ooniDescriptor.getDisplayIcon(context), - color = ooniDescriptor.color, - animation = ooniDescriptor.animation, - dataUsage = ooniDescriptor.dataUsage, - nettest = (ooniDescriptor.nettests).filter { nettest -> + + else -> ooniDescriptor.nettests.any { nettest -> preferenceManager.resolveStatus( name = nettest.name, prefix = ooniDescriptor.preferencePrefix(), autoRun = true ) - }.run { - this + (ooniDescriptor.longRunningTests?.filter { nettest -> + } + } + }.map { ooniDescriptor -> + when (ooniDescriptor.name) { + OONITests.EXPERIMENTAL.label -> DynamicTestSuite( + name = ooniDescriptor.name, + title = ooniDescriptor.title, + shortDescription = ooniDescriptor.shortDescription, + description = ooniDescriptor.description, + icon = ooniDescriptor.getDisplayIcon(context), + icon_24 = ooniDescriptor.getDisplayIcon(context), + color = ooniDescriptor.color, + animation = ooniDescriptor.animation, + dataUsage = ooniDescriptor.dataUsage, + nettest = (ooniDescriptor.nettests).run { + this + (ooniDescriptor.longRunningTests?.filter { nettest -> + preferenceManager.resolveStatus( + name = nettest.name, + prefix = ooniDescriptor.preferencePrefix(), + autoRun = true + ) + } ?: listOf()) + } + ).apply { + autoRun = true + } + + else -> DynamicTestSuite( + name = ooniDescriptor.name, + title = ooniDescriptor.title, + shortDescription = ooniDescriptor.shortDescription, + description = ooniDescriptor.description, + icon = ooniDescriptor.getDisplayIcon(context), + icon_24 = ooniDescriptor.getDisplayIcon(context), + color = ooniDescriptor.color, + animation = ooniDescriptor.animation, + dataUsage = ooniDescriptor.dataUsage, + nettest = (ooniDescriptor.nettests).filter { nettest -> preferenceManager.resolveStatus( name = nettest.name, prefix = ooniDescriptor.preferencePrefix(), autoRun = true ) - } ?: listOf()) + }.run { + this + (ooniDescriptor.longRunningTests?.filter { nettest -> + preferenceManager.resolveStatus( + name = nettest.name, + prefix = ooniDescriptor.preferencePrefix(), + autoRun = true + ) + } ?: listOf()) + } + ).apply { + autoRun = true } - ).apply { - autoRun = true } } } diff --git a/app/src/main/java/org/openobservatory/ooniprobe/common/PreferenceManagerExtension.kt b/app/src/main/java/org/openobservatory/ooniprobe/common/PreferenceManagerExtension.kt index 4ed97ce74..97b728642 100644 --- a/app/src/main/java/org/openobservatory/ooniprobe/common/PreferenceManagerExtension.kt +++ b/app/src/main/java/org/openobservatory/ooniprobe/common/PreferenceManagerExtension.kt @@ -30,6 +30,7 @@ fun PreferenceManager.resolveStatus( return isExperimentalOn } } + val key = getPreferenceKey(name = name, prefix = prefix, autoRun = autoRun) return if (autoRun) { sp.getBoolean( getPreferenceKey(name = name, prefix = prefix, autoRun = autoRun), @@ -78,6 +79,8 @@ private fun PreferenceManager.setValue( if (experimentalTestList().contains(name) && !autoRun) { return false } + val key = getPreferenceKey(name = name, prefix = prefix, autoRun = autoRun) + return with(sp.edit()) { putBoolean(getPreferenceKey(name = name, prefix = prefix, autoRun = autoRun), value) commit()