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()
|
||||
Reference in New Issue
Block a user