From 14930469d5b30937259160f0cb97686b6c096f49 Mon Sep 17 00:00:00 2001 From: Norbel AMBANUMBEN Date: Sun, 11 Feb 2024 10:47:15 +0100 Subject: [PATCH] fix: https://github.com/ooni/probe/issues/2659#issuecomment-1912270537 (#660) Fixes https://github.com/ooni/probe/issues/2659#issuecomment-1912270537 ## Proposed Changes - Update `ReadMorePlugin` to take a `maxLength` parameter with default value `150`. - Update `OverviewActivity` to allow modification of all automated update items. - Update `RunTestsActivity` to save preferences only when the tests are run. --- .../ooniprobe/activity/OverviewActivity.java | 23 ++++-- .../OverviewTestsExpandableListViewAdapter.kt | 16 +++- .../activity/overview/OverviewViewModel.kt | 48 +++++++++--- .../activity/runtests/RunTestsActivity.kt | 29 +++++++ .../activity/runtests/RunTestsViewModel.kt | 35 --------- .../RunTestsExpandableListViewAdapter.kt | 13 ---- .../ooniprobe/common/OONIDescriptor.kt | 76 ++++++++++++++++++- .../common/PreferenceManagerExtension.kt | 21 +++-- .../ooniprobe/common/ReadMorePlugin.kt | 20 ++++- .../ooniprobe/common/service/ServiceUtil.java | 18 +---- .../ooniprobe/fragment/DashboardFragment.kt | 12 ++- 11 files changed, 214 insertions(+), 97 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 1ed65ca77..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; @@ -32,6 +33,7 @@ import org.openobservatory.ooniprobe.model.database.Result; import java.util.Locale; +import java.util.Objects; import javax.inject.Inject; @@ -70,8 +72,10 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { setThemeColor(ContextCompat.getColor(this, descriptor.getColor())); binding.icon.setImageResource(descriptor.getDisplayIcon(this)); binding.customUrl.setVisibility(descriptor.getName().equals(OONITests.WEBSITES.getLabel()) ? View.VISIBLE : View.GONE); - Markwon markwon = Markwon.builder(this).usePlugin(new ReadMorePlugin(getString(R.string.OONIRun_ReadMore), getString(R.string.OONIRun_ReadLess))).build(); - if (descriptor.getName().equals(OONITests.EXPERIMENTAL.name())) { + Markwon markwon = Markwon.builder(this) + .usePlugin(new ReadMorePlugin(getString(R.string.OONIRun_ReadMore), getString(R.string.OONIRun_ReadLess), 400)) + .build(); + if (Objects.equals(descriptor.getName(), OONITests.EXPERIMENTAL.name())) { markwon.setMarkdown(binding.desc, descriptor.getDescription()); if (TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL) { binding.desc.setTextDirection(View.TEXT_DIRECTION_RTL); @@ -107,14 +111,17 @@ 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); + } } - binding.switchTests.setEnabled(descriptor.hasPreferencePrefix()); // Expand all groups for (int i = 0; i < adapter.getGroupCount(); i++) { binding.expandableListView.expandGroup(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 9346b1da6..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 -> { @@ -96,12 +97,21 @@ class OverviewTestsExpandableListViewAdapter( } groupCheckBox.isChecked = groupItem.selected - // Disable experimental or webconnectivity test + + /** + * 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 { - groupCheckBox.isEnabled = hasPreferencePrefix() + 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/activity/runtests/RunTestsActivity.kt b/app/src/main/java/org/openobservatory/ooniprobe/activity/runtests/RunTestsActivity.kt index ad2c69c40..fc40b4733 100644 --- a/app/src/main/java/org/openobservatory/ooniprobe/activity/runtests/RunTestsActivity.kt +++ b/app/src/main/java/org/openobservatory/ooniprobe/activity/runtests/RunTestsActivity.kt @@ -18,7 +18,10 @@ import org.openobservatory.ooniprobe.activity.runtests.adapter.RunTestsExpandabl import org.openobservatory.ooniprobe.activity.runtests.models.ChildItem import org.openobservatory.ooniprobe.activity.runtests.models.GroupItem import org.openobservatory.ooniprobe.common.OONIDescriptor +import org.openobservatory.ooniprobe.common.OONITests import org.openobservatory.ooniprobe.common.PreferenceManager +import org.openobservatory.ooniprobe.common.enableTest +import org.openobservatory.ooniprobe.common.disableTest import org.openobservatory.ooniprobe.databinding.ActivityRunTestsBinding import java.io.Serializable import javax.inject.Inject @@ -104,6 +107,7 @@ class RunTestsActivity : AbstractActivity() { private fun onMenuItemClickListener(menuItem: MenuItem): Boolean { return when (menuItem.itemId) { R.id.runButton -> { + updatePreferences() val selectedChildItems: List = getChildItemsSelectedIdList() if (selectedChildItems.isNotEmpty()) { val testSuitesToRun = getGroupItemsAtLeastOneChildEnabled().map { groupItem -> @@ -124,6 +128,31 @@ class RunTestsActivity : AbstractActivity() { } } + /** + * Update the preferences based on the selected tests. + * This method is used to update the preferences when the user has selected the tests that they want to run. + */ + private fun updatePreferences() { + for (i in 0 until adapter.groupCount) { + val group = adapter.getGroup(i) + when (group.name) { + OONITests.EXPERIMENTAL.label -> { + val testNames = OONITests.EXPERIMENTAL.nettests.map { it.name }; + when(group.nettests.filter { testNames.contains(it.name) }.map { it.selected }.all { it }) { + true -> preferenceManager.enableTest(OONITests.EXPERIMENTAL.label) + false -> preferenceManager.disableTest(OONITests.EXPERIMENTAL.label) + } + } + else -> group.nettests.forEach { nettest -> + when(nettest.selected) { + true -> preferenceManager.enableTest(nettest.name) + false -> preferenceManager.disableTest(nettest.name) + } + } + } + } + } + private fun selectAllBtnStatusObserver(selectAllBtnStatus: String?) { if (!TextUtils.isEmpty(selectAllBtnStatus)) { when (selectAllBtnStatus) { diff --git a/app/src/main/java/org/openobservatory/ooniprobe/activity/runtests/RunTestsViewModel.kt b/app/src/main/java/org/openobservatory/ooniprobe/activity/runtests/RunTestsViewModel.kt index 61ec6df97..ffb1d95f3 100644 --- a/app/src/main/java/org/openobservatory/ooniprobe/activity/runtests/RunTestsViewModel.kt +++ b/app/src/main/java/org/openobservatory/ooniprobe/activity/runtests/RunTestsViewModel.kt @@ -25,41 +25,6 @@ class RunTestsViewModel() : ViewModel() { fun setSelectedAllBtnStatus(selectedStatus: String) { selectedAllBtnStatus.postValue(selectedStatus) - when (selectedStatus) { - SELECT_ALL -> { - OONITests.INSTANT_MESSAGING.nettests.forEach { - enableTest(it.name) - } - OONITests.CIRCUMVENTION.nettests.forEach { - enableTest(it.name) - } - OONITests.PERFORMANCE.nettests.forEach { - enableTest(it.name) - } - enableTest(OONITests.EXPERIMENTAL.label) - } - - SELECT_NONE -> { - OONITests.INSTANT_MESSAGING.nettests.forEach { - disableTest(it.name) - } - OONITests.CIRCUMVENTION.nettests.forEach { - disableTest(it.name) - } - OONITests.PERFORMANCE.nettests.forEach { - disableTest(it.name) - } - disableTest(OONITests.EXPERIMENTAL.label) - } - } - } - - fun disableTest(name: String) { - preferenceManager.disableTest(name) - } - - fun enableTest(name: String) { - preferenceManager.enableTest(name) } companion object { diff --git a/app/src/main/java/org/openobservatory/ooniprobe/activity/runtests/adapter/RunTestsExpandableListViewAdapter.kt b/app/src/main/java/org/openobservatory/ooniprobe/activity/runtests/adapter/RunTestsExpandableListViewAdapter.kt index 9291be328..aa690592e 100644 --- a/app/src/main/java/org/openobservatory/ooniprobe/activity/runtests/adapter/RunTestsExpandableListViewAdapter.kt +++ b/app/src/main/java/org/openobservatory/ooniprobe/activity/runtests/adapter/RunTestsExpandableListViewAdapter.kt @@ -103,22 +103,11 @@ class RunTestsExpandableListViewAdapter( if (groupItem.selected) { if (isSelectAllChildItems(groupItem.nettests)) { groupSelectionIndicator.setImageResource(R.drawable.check_box) - // NOTE: This is the only place where OONITests.EXPERIMENTAL.label is used. - // This doesn't follow the normal rule where the component tests make up the suite. - if (groupItem.name == OONITests.EXPERIMENTAL.label) { - viewModel.enableTest(OONITests.EXPERIMENTAL.label) - } } else { groupSelectionIndicator.setImageResource(R.drawable.check_box_outline_blank) - if (groupItem.name == OONITests.EXPERIMENTAL.label) { - viewModel.disableTest(OONITests.EXPERIMENTAL.label) - } } } else { groupSelectionIndicator.setImageResource(R.drawable.check_box_outline_blank) - if (groupItem.name == OONITests.EXPERIMENTAL.label) { - viewModel.disableTest(OONITests.EXPERIMENTAL.label) - } } groupSelectionIndicator.setOnClickListener { if (groupItem.selected && isSelectAllChildItems(groupItem.nettests)) { @@ -193,7 +182,6 @@ class RunTestsExpandableListViewAdapter( setOnClickListener { if (childItem.selected) { childItem.selected = false - viewModel.disableTest(childItem.name) if (isNotSelectedAnyChildItems(groupItem.nettests)) { groupItem.selected = false } @@ -204,7 +192,6 @@ class RunTestsExpandableListViewAdapter( } } else { childItem.selected = true - viewModel.enableTest(childItem.name) groupItem.selected = true if (isSelectedAllItems(groupedListData)) { viewModel.setSelectedAllBtnStatus(SELECT_ALL) 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 f31c477e0..b1f827636 100644 --- a/app/src/main/java/org/openobservatory/ooniprobe/common/OONIDescriptor.kt +++ b/app/src/main/java/org/openobservatory/ooniprobe/common/OONIDescriptor.kt @@ -70,7 +70,6 @@ open class OONIDescriptor( TestGroupItem( selected = when (name) { OONITests.EXPERIMENTAL.label -> preferenceManager.isExperimentalOn - OONITests.WEBSITES.label -> preferenceManager.countEnabledCategory() > 0 else -> preferenceManager.resolveStatus( name = it.name, prefix = preferencePrefix(), @@ -345,6 +344,81 @@ enum class OONITests( } } +fun autoRunTests(context: Context, preferenceManager: PreferenceManager): List { + + return ooniDescriptors(context).filter { ooniDescriptor -> + when (ooniDescriptor.name) { + OONITests.EXPERIMENTAL.label -> preferenceManager.resolveStatus( + name = ooniDescriptor.name, + prefix = ooniDescriptor.preferencePrefix(), + autoRun = true + ) + + else -> ooniDescriptor.nettests.any { nettest -> + preferenceManager.resolveStatus( + name = nettest.name, + prefix = ooniDescriptor.preferencePrefix(), + autoRun = true + ) + } + } + }.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 + ) + }.run { + this + (ooniDescriptor.longRunningTests?.filter { nettest -> + preferenceManager.resolveStatus( + name = nettest.name, + prefix = ooniDescriptor.preferencePrefix(), + autoRun = true + ) + } ?: listOf()) + } + ).apply { + autoRun = true + } + } + } +} + /** * Creates a list of [OONIDescriptor] representing the OONI tests. * 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 56965594c..97b728642 100644 --- a/app/src/main/java/org/openobservatory/ooniprobe/common/PreferenceManagerExtension.kt +++ b/app/src/main/java/org/openobservatory/ooniprobe/common/PreferenceManagerExtension.kt @@ -8,7 +8,7 @@ private fun PreferenceManager.experimentalTestList(): MutableList { val exclusionList = mutableListOf() OONITests.EXPERIMENTAL.run { exclusionList.addAll(nettests.map { it.name }) - exclusionList.addAll(nettests.map { it.name }) + longRunningTests?.map { it.name }?.let { exclusionList.addAll(it) } } return exclusionList @@ -23,11 +23,14 @@ private fun PreferenceManager.experimentalTestList(): MutableList { fun PreferenceManager.resolveStatus( name: String, prefix: String, autoRun: Boolean = false ): Boolean { - if (name == WebConnectivity.NAME) { - return true - } else if (experimentalTestList().contains(name)) { - return isExperimentalOn + if (!autoRun) { + if (name == WebConnectivity.NAME) { + return true + } else if (experimentalTestList().contains(name)) { + return isExperimentalOn + } } + val key = getPreferenceKey(name = name, prefix = prefix, autoRun = autoRun) return if (autoRun) { sp.getBoolean( getPreferenceKey(name = name, prefix = prefix, autoRun = autoRun), @@ -73,9 +76,11 @@ private fun PreferenceManager.setValue( prefix: String, autoRun: Boolean = false, ): Boolean { - if (name == WebConnectivity.NAME || experimentalTestList().contains(name)) { + 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() @@ -135,7 +140,7 @@ fun PreferenceManager.getPreferenceKey(name: String): String { OONITests.EXPERIMENTAL.label -> r.getString(R.string.experimental) - else -> throw IllegalArgumentException("Unknown preference for: $name") + else -> name } } @@ -174,7 +179,7 @@ fun PreferenceManager.disableTest(name: String): Boolean { * @return true if the preference was successfully set, false otherwise. */ private fun PreferenceManager.setValue(name: String, value: Boolean): Boolean { - if (name == WebConnectivity.NAME || experimentalTestList().contains(name)) { + if (experimentalTestList().contains(name)) { return false } return with(sp.edit()) { diff --git a/app/src/main/java/org/openobservatory/ooniprobe/common/ReadMorePlugin.kt b/app/src/main/java/org/openobservatory/ooniprobe/common/ReadMorePlugin.kt index 9cef24f39..13ab06ffa 100644 --- a/app/src/main/java/org/openobservatory/ooniprobe/common/ReadMorePlugin.kt +++ b/app/src/main/java/org/openobservatory/ooniprobe/common/ReadMorePlugin.kt @@ -13,9 +13,22 @@ import io.noties.markwon.AbstractMarkwonPlugin * Read more plugin based on text length. * @see ReadMorePluginSample */ -class ReadMorePlugin(private val labelMore: String, private val labelLess: String) : - AbstractMarkwonPlugin() { - private val maxLength = 150 +class ReadMorePlugin private constructor( + private val labelMore: String, + private val labelLess: String, + private val maxLength: Int +) : AbstractMarkwonPlugin() { + + constructor( + labelMore: String, + labelLess: String, + maxLength: Int? + ) : this(labelMore, labelLess, maxLength ?: 150) + + constructor( + labelMore: String, + labelLess: String, + ) : this(labelMore, labelLess, 150) override fun afterSetText(textView: TextView) { val text = textView.text @@ -76,6 +89,7 @@ class ReadMorePlugin(private val labelMore: String, private val labelLess: Strin } companion object { + private fun trim(builder: SpannableStringBuilder) { // NB! tables use `\u00a0` (non breaking space) which is not reported as white-space diff --git a/app/src/main/java/org/openobservatory/ooniprobe/common/service/ServiceUtil.java b/app/src/main/java/org/openobservatory/ooniprobe/common/service/ServiceUtil.java index 2e7f8f768..caa2157d7 100644 --- a/app/src/main/java/org/openobservatory/ooniprobe/common/service/ServiceUtil.java +++ b/app/src/main/java/org/openobservatory/ooniprobe/common/service/ServiceUtil.java @@ -1,5 +1,7 @@ package org.openobservatory.ooniprobe.common.service; +import static org.openobservatory.ooniprobe.common.OONIDescriptorKt.autoRunTests; + import android.app.job.JobInfo; import android.app.job.JobScheduler; import android.content.ComponentName; @@ -75,21 +77,7 @@ public static void startRunTestServiceUnattended(Application app) { if (!d.generateAutoRunServiceSuite.shouldStart(config.isOnWiFi(), config.isCharging(), isVPNInUse)) { return; } - - AbstractSuite suite = d.generateAutoRunServiceSuite.generate(); - ArrayList testSuites = new ArrayList<>(); - testSuites.add(suite); - testSuites.addAll( - Lists.transform( - List.of(OONITests.INSTANT_MESSAGING, OONITests.CIRCUMVENTION, OONITests.PERFORMANCE, OONITests.EXPERIMENTAL), - item -> { - DynamicTestSuite testSuite = item.toOONIDescriptor(app).getTest(app); - testSuite.setAutoRun(true); - return testSuite; - } - ) - ); - ServiceUtil.startRunTestServiceCommon(app, testSuites, false, true); + ServiceUtil.startRunTestServiceCommon(app, new ArrayList<>(autoRunTests(app, d.preferenceManager)), false, true); d.generateAutoRunServiceSuite.markAsRan(); } diff --git a/app/src/main/java/org/openobservatory/ooniprobe/fragment/DashboardFragment.kt b/app/src/main/java/org/openobservatory/ooniprobe/fragment/DashboardFragment.kt index c5857f0f3..4ef973b80 100644 --- a/app/src/main/java/org/openobservatory/ooniprobe/fragment/DashboardFragment.kt +++ b/app/src/main/java/org/openobservatory/ooniprobe/fragment/DashboardFragment.kt @@ -33,9 +33,13 @@ class DashboardFragment : Fragment(), View.OnClickListener { @Inject lateinit var viewModel: DashboardViewModel + private var descriptors: ArrayList> = ArrayList() + private lateinit var binding: FragmentDashboardBinding + private lateinit var adapter: DashboardAdapter + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -58,7 +62,8 @@ class DashboardFragment : Fragment(), View.OnClickListener { super.onViewCreated(view, savedInstanceState) viewModel.getGroupedItemList().observe(viewLifecycleOwner) { items -> binding.recycler.layoutManager = LinearLayoutManager(requireContext()) - binding.recycler.adapter = DashboardAdapter(items, this, preferenceManager) + adapter = DashboardAdapter(items, this, preferenceManager) + binding.recycler.adapter = adapter } viewModel.items.observe(viewLifecycleOwner) { items -> @@ -71,6 +76,11 @@ class DashboardFragment : Fragment(), View.OnClickListener { override fun onResume() { super.onResume() + /** + * Updates the list of tests when the user changes the default configuration + * after starting a test from [RunTestsActivity] + */ + binding.recycler.post { adapter.notifyDataSetChanged() } setLastTest() if (ReachabilityManager.isVPNinUse(this.context) && preferenceManager.isWarnVPNInUse