UpdatesPreference: Allow to configure automated updates constraints
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
@@ -20,6 +20,9 @@ import com.aurora.store.data.model.UpdateMode
|
||||
import com.aurora.store.data.room.update.UpdateDao
|
||||
import com.aurora.store.data.work.UpdateWorker
|
||||
import com.aurora.store.util.Preferences
|
||||
import com.aurora.store.util.Preferences.PREFERENCES_UPDATES_RESTRICTIONS_BATTERY
|
||||
import com.aurora.store.util.Preferences.PREFERENCES_UPDATES_RESTRICTIONS_IDLE
|
||||
import com.aurora.store.util.Preferences.PREFERENCES_UPDATES_RESTRICTIONS_METERED
|
||||
import com.aurora.store.util.Preferences.PREFERENCE_UPDATES_CHECK_INTERVAL
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
@@ -160,10 +163,18 @@ class UpdateHelper @Inject constructor(
|
||||
).toLong()
|
||||
|
||||
val constraints = Constraints.Builder()
|
||||
.setRequiredNetworkType(NetworkType.UNMETERED)
|
||||
.setRequiresBatteryNotLow(true)
|
||||
|
||||
if (isMAndAbove) constraints.setRequiresDeviceIdle(true)
|
||||
if (Preferences.getBoolean(context, PREFERENCES_UPDATES_RESTRICTIONS_METERED, true)) {
|
||||
constraints.setRequiredNetworkType(NetworkType.UNMETERED)
|
||||
}
|
||||
|
||||
if (Preferences.getBoolean(context, PREFERENCES_UPDATES_RESTRICTIONS_BATTERY, true)) {
|
||||
constraints.setRequiresBatteryNotLow(true)
|
||||
}
|
||||
|
||||
if (isMAndAbove && Preferences.getBoolean(context, PREFERENCES_UPDATES_RESTRICTIONS_IDLE, true)) {
|
||||
constraints.setRequiresDeviceIdle(true)
|
||||
}
|
||||
|
||||
return PeriodicWorkRequestBuilder<UpdateWorker>(
|
||||
repeatInterval = updateCheckInterval,
|
||||
|
||||
@@ -55,6 +55,10 @@ object Preferences {
|
||||
const val PREFERENCE_UPDATES_EXTENDED = "PREFERENCE_UPDATES_EXTENDED"
|
||||
const val PREFERENCE_UPDATES_AUTO = "PREFERENCE_UPDATES_AUTO"
|
||||
const val PREFERENCE_UPDATES_CHECK_INTERVAL = "PREFERENCE_UPDATES_CHECK_INTERVAL"
|
||||
const val PREFERENCES_UPDATES_RESTRICTIONS = "PREFERENCES_UPDATES_RESTRICTIONS"
|
||||
const val PREFERENCES_UPDATES_RESTRICTIONS_METERED = "PREFERENCES_UPDATES_RESTRICTIONS_METERED"
|
||||
const val PREFERENCES_UPDATES_RESTRICTIONS_IDLE = "PREFERENCES_UPDATES_RESTRICTIONS_IDLE"
|
||||
const val PREFERENCES_UPDATES_RESTRICTIONS_BATTERY = "PREFERENCES_UPDATES_RESTRICTIONS_BATTERY"
|
||||
|
||||
const val PREFERENCE_MIGRATION_VERSION = "PREFERENCE_MIGRATION_VERSION"
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
package com.aurora.store.view.ui.preferences
|
||||
package com.aurora.store.view.ui.preferences.updates
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
@@ -25,18 +25,21 @@ import androidx.appcompat.widget.Toolbar
|
||||
import androidx.fragment.app.viewModels
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import androidx.preference.ListPreference
|
||||
import androidx.preference.Preference
|
||||
import androidx.preference.SeekBarPreference
|
||||
import androidx.preference.SwitchPreferenceCompat
|
||||
import com.aurora.store.R
|
||||
import com.aurora.store.data.model.PermissionType
|
||||
import com.aurora.store.data.model.UpdateMode
|
||||
import com.aurora.store.util.Preferences
|
||||
import com.aurora.store.util.Preferences.PREFERENCES_UPDATES_RESTRICTIONS
|
||||
import com.aurora.store.util.Preferences.PREFERENCE_FILTER_AURORA_ONLY
|
||||
import com.aurora.store.util.Preferences.PREFERENCE_FILTER_FDROID
|
||||
import com.aurora.store.util.Preferences.PREFERENCE_UPDATES_AUTO
|
||||
import com.aurora.store.util.Preferences.PREFERENCE_UPDATES_CHECK_INTERVAL
|
||||
import com.aurora.store.util.Preferences.PREFERENCE_UPDATES_EXTENDED
|
||||
import com.aurora.store.util.save
|
||||
import com.aurora.store.view.ui.preferences.BasePreferenceFragment
|
||||
import com.aurora.store.viewmodel.all.UpdatesViewModel
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
|
||||
@@ -49,11 +52,13 @@ class UpdatesPreference : BasePreferenceFragment() {
|
||||
setPreferencesFromResource(R.xml.preferences_updates, rootKey)
|
||||
|
||||
findPreference<ListPreference>(PREFERENCE_UPDATES_AUTO)?.setOnPreferenceChangeListener { _, newValue ->
|
||||
val updateRestrictionsPref = findPreference<Preference>(PREFERENCES_UPDATES_RESTRICTIONS)
|
||||
val updateCheckIntervalPref =
|
||||
findPreference<SeekBarPreference>(PREFERENCE_UPDATES_CHECK_INTERVAL)
|
||||
|
||||
when (UpdateMode.entries[newValue.toString().toInt()]) {
|
||||
UpdateMode.DISABLED -> {
|
||||
updateRestrictionsPref?.isEnabled = false
|
||||
updateCheckIntervalPref?.isEnabled = false
|
||||
viewModel.updateHelper.cancelAutomatedCheck()
|
||||
requireContext().save(PREFERENCE_UPDATES_AUTO, 0)
|
||||
@@ -62,12 +67,14 @@ class UpdatesPreference : BasePreferenceFragment() {
|
||||
|
||||
UpdateMode.CHECK_AND_NOTIFY -> {
|
||||
if (permissionProvider.isGranted(PermissionType.POST_NOTIFICATIONS)) {
|
||||
updateRestrictionsPref?.isEnabled = true
|
||||
updateCheckIntervalPref?.isEnabled = true
|
||||
viewModel.updateHelper.scheduleAutomatedCheck()
|
||||
true
|
||||
} else {
|
||||
permissionProvider.request(PermissionType.POST_NOTIFICATIONS) {
|
||||
if (it) {
|
||||
updateRestrictionsPref?.isEnabled = true
|
||||
updateCheckIntervalPref?.isEnabled = true
|
||||
requireContext().save(PREFERENCE_UPDATES_AUTO, 1)
|
||||
viewModel.updateHelper.scheduleAutomatedCheck()
|
||||
@@ -80,12 +87,14 @@ class UpdatesPreference : BasePreferenceFragment() {
|
||||
|
||||
UpdateMode.CHECK_AND_INSTALL -> {
|
||||
if (permissionProvider.isGranted(PermissionType.DOZE_WHITELIST)) {
|
||||
updateRestrictionsPref?.isEnabled = true
|
||||
updateCheckIntervalPref?.isEnabled = true
|
||||
viewModel.updateHelper.scheduleAutomatedCheck()
|
||||
true
|
||||
} else {
|
||||
permissionProvider.request(PermissionType.DOZE_WHITELIST) {
|
||||
if (it) {
|
||||
updateRestrictionsPref?.isEnabled = true
|
||||
updateCheckIntervalPref?.isEnabled = true
|
||||
requireContext().save(PREFERENCE_UPDATES_AUTO, 2)
|
||||
viewModel.updateHelper.scheduleAutomatedCheck()
|
||||
@@ -100,6 +109,14 @@ class UpdatesPreference : BasePreferenceFragment() {
|
||||
}
|
||||
}
|
||||
|
||||
findPreference<Preference>(PREFERENCES_UPDATES_RESTRICTIONS)?.apply {
|
||||
isEnabled = Preferences.getInteger(requireContext(), PREFERENCE_UPDATES_AUTO) != 0
|
||||
setOnPreferenceClickListener {
|
||||
findNavController().navigate(R.id.updatesRestrictionsDialog)
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
findPreference<SeekBarPreference>(PREFERENCE_UPDATES_CHECK_INTERVAL)?.apply {
|
||||
isEnabled = Preferences.getInteger(requireContext(), PREFERENCE_UPDATES_AUTO) != 0
|
||||
setOnPreferenceChangeListener { _, _ ->
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2025 The Calyx Institute
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package com.aurora.store.view.ui.preferences.updates
|
||||
|
||||
import android.app.Dialog
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import androidx.fragment.app.DialogFragment
|
||||
import androidx.fragment.app.viewModels
|
||||
import com.aurora.store.R
|
||||
import com.aurora.store.util.Preferences
|
||||
import com.aurora.store.util.Preferences.PREFERENCES_UPDATES_RESTRICTIONS_BATTERY
|
||||
import com.aurora.store.util.Preferences.PREFERENCES_UPDATES_RESTRICTIONS_IDLE
|
||||
import com.aurora.store.util.Preferences.PREFERENCES_UPDATES_RESTRICTIONS_METERED
|
||||
import com.aurora.store.viewmodel.preferences.UpdatesRestrictionsViewModel
|
||||
import com.google.android.material.checkbox.MaterialCheckBox
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
|
||||
@AndroidEntryPoint
|
||||
class UpdatesRestrictionsDialog : DialogFragment() {
|
||||
|
||||
private val viewModel: UpdatesRestrictionsViewModel by viewModels()
|
||||
|
||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||
val view = layoutInflater.inflate(R.layout.dialog_auto_updates_restrictions, null)
|
||||
return MaterialAlertDialogBuilder(requireContext())
|
||||
.setTitle(R.string.pref_updates_restrictions_title)
|
||||
.setMessage(R.string.pref_updates_restrictions_desc)
|
||||
.setView(view)
|
||||
.setPositiveButton(getString(android.R.string.ok)) { _, _ -> dialog?.dismiss()}
|
||||
.create()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
context?.let { setupRestrictions(it) }
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
viewModel.updateHelper.updateAutomatedCheck()
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
private fun setupRestrictions(ctx: Context) {
|
||||
dialog?.findViewById<MaterialCheckBox>(R.id.checkboxMetered)?.apply {
|
||||
isChecked = Preferences.getBoolean(ctx, PREFERENCES_UPDATES_RESTRICTIONS_METERED, true)
|
||||
setOnCheckedChangeListener { _, isChecked ->
|
||||
Preferences.putBoolean(ctx, PREFERENCES_UPDATES_RESTRICTIONS_METERED, isChecked)
|
||||
}
|
||||
}
|
||||
|
||||
dialog?.findViewById<MaterialCheckBox>(R.id.checkboxIdle)?.apply {
|
||||
isChecked = Preferences.getBoolean(ctx, PREFERENCES_UPDATES_RESTRICTIONS_IDLE, true)
|
||||
setOnCheckedChangeListener { _, isChecked ->
|
||||
Preferences.putBoolean(ctx, PREFERENCES_UPDATES_RESTRICTIONS_IDLE, isChecked)
|
||||
}
|
||||
}
|
||||
|
||||
dialog?.findViewById<MaterialCheckBox>(R.id.checkboxBattery)?.apply {
|
||||
isChecked = Preferences.getBoolean(ctx, PREFERENCES_UPDATES_RESTRICTIONS_BATTERY, true)
|
||||
setOnCheckedChangeListener { _, isChecked ->
|
||||
Preferences.putBoolean(ctx, PREFERENCES_UPDATES_RESTRICTIONS_BATTERY, isChecked)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2025 The Calyx Institute
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package com.aurora.store.viewmodel.preferences
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import com.aurora.store.data.helper.UpdateHelper
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
class UpdatesRestrictionsViewModel @Inject constructor(val updateHelper: UpdateHelper) : ViewModel()
|
||||
32
app/src/main/res/layout/dialog_auto_updates_restrictions.xml
Normal file
32
app/src/main/res/layout/dialog_auto_updates_restrictions.xml
Normal file
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ SPDX-FileCopyrightText: 2025 The Calyx Institute
|
||||
~ SPDX-License-Identifier: GPL-3.0-or-later
|
||||
-->
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:paddingHorizontal="@dimen/padding_large">
|
||||
|
||||
<com.google.android.material.checkbox.MaterialCheckBox
|
||||
android:id="@+id/checkboxMetered"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:checked="true"
|
||||
android:text="@string/pref_updates_restrictions_metered" />
|
||||
|
||||
<com.google.android.material.checkbox.MaterialCheckBox
|
||||
android:id="@+id/checkboxBattery"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:checked="true"
|
||||
android:text="@string/pref_updates_restrictions_battery" />
|
||||
|
||||
<com.google.android.material.checkbox.MaterialCheckBox
|
||||
android:id="@+id/checkboxIdle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:checked="true"
|
||||
android:text="@string/pref_updates_restrictions_idle" />
|
||||
</LinearLayout>
|
||||
@@ -113,7 +113,7 @@
|
||||
tools:layout="@layout/fragment_setting" />
|
||||
<fragment
|
||||
android:id="@+id/updatesPreference"
|
||||
android:name="com.aurora.store.view.ui.preferences.UpdatesPreference"
|
||||
android:name="com.aurora.store.view.ui.preferences.updates.UpdatesPreference"
|
||||
android:label="UpdatesPreference"
|
||||
tools:layout="@layout/fragment_setting" />
|
||||
<fragment
|
||||
@@ -468,10 +468,14 @@
|
||||
</dialog>
|
||||
<dialog
|
||||
android:id="@+id/proxyURLDialog"
|
||||
android:name="com.aurora.store.view.ui.preferences.ProxyURLDialog"
|
||||
android:name="com.aurora.store.view.ui.preferences.network.ProxyURLDialog"
|
||||
android:label="@string/pref_network_proxy_url" />
|
||||
<dialog
|
||||
android:id="@+id/forceRestartDialog"
|
||||
android:name="com.aurora.store.view.ui.commons.ForceRestartDialog"
|
||||
android:label="@string/force_restart_title" />
|
||||
<dialog
|
||||
android:id="@+id/updatesRestrictionsDialog"
|
||||
android:name="com.aurora.store.view.ui.preferences.updates.UpdatesRestrictionsDialog"
|
||||
android:label="@string/pref_updates_restrictions_title" />
|
||||
</navigation>
|
||||
|
||||
@@ -495,4 +495,11 @@
|
||||
<string name="toast_proxy_disabled">Proxy disabled successfully</string>
|
||||
<string name="pref_network_proxy_desc">View and manage proxy configuration</string>
|
||||
<string name="pref_network_proxy_url_hint" translatable="false">protocol://user:password@host:port</string>
|
||||
|
||||
<!-- UpdatesPreferences -->
|
||||
<string name="pref_updates_restrictions_title">Automatic updates restrictions</string>
|
||||
<string name="pref_updates_restrictions_desc">Configure device restrictions for automated updates.</string>
|
||||
<string name="pref_updates_restrictions_metered">Only on unmetered networks</string>
|
||||
<string name="pref_updates_restrictions_idle">When device is idle</string>
|
||||
<string name="pref_updates_restrictions_battery">When battery is not low</string>
|
||||
</resources>
|
||||
|
||||
@@ -40,6 +40,13 @@
|
||||
app:min="1"
|
||||
app:showSeekBarValue="true" />
|
||||
|
||||
<Preference
|
||||
app:disableDependentsState="false"
|
||||
app:iconSpaceReserved="false"
|
||||
app:key="PREFERENCES_UPDATES_RESTRICTIONS"
|
||||
app:summary="@string/pref_updates_restrictions_desc"
|
||||
app:title="@string/pref_updates_restrictions_title" />
|
||||
|
||||
<PreferenceCategory
|
||||
app:iconSpaceReserved="false"
|
||||
app:singleLineTitle="false"
|
||||
|
||||
Reference in New Issue
Block a user