diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/ExternalBackupStorage.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/ExternalBackupStorage.kt index ccef8b64d..4c6982d4b 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/ExternalBackupStorage.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/ExternalBackupStorage.kt @@ -64,6 +64,9 @@ class ExternalBackupStorage @Inject constructor( suspend fun getLastBackupDate() = listOrNull()?.maxOfOrNull { it.dateTime } suspend fun trim(maxCount: Int): Boolean { + if (maxCount == Int.MAX_VALUE) { + return false + } val list = listOrNull() if (list == null || list.size <= maxCount) { return false diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 52685ab9a..0d134583b 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -12,7 +12,6 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.collection.ArraySet import androidx.core.content.edit import androidx.core.os.LocaleListCompat -import androidx.core.util.TimeUtils import androidx.documentfile.provider.DocumentFile import androidx.preference.PreferenceManager import dagger.hilt.android.qualifiers.ApplicationContext @@ -476,7 +475,11 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { get() = TimeUnit.DAYS.toMillis(prefs.getString(KEY_BACKUP_PERIODICAL_FREQUENCY, null)?.toLongOrNull() ?: 7L) val periodicalBackupMaxCount: Int - get() = prefs.getInt(KEY_BACKUP_PERIODICAL_COUNT, 10) + get() = if (prefs.getBoolean(KEY_BACKUP_PERIODICAL_TRIM, true)) { + prefs.getInt(KEY_BACKUP_PERIODICAL_COUNT, 10) + } else { + Int.MAX_VALUE + } var periodicalBackupDirectory: Uri? get() = prefs.getString(KEY_BACKUP_PERIODICAL_OUTPUT, null)?.toUriOrNull() @@ -626,6 +629,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { const val KEY_RESTORE = "restore" const val KEY_BACKUP_PERIODICAL_ENABLED = "backup_periodic" const val KEY_BACKUP_PERIODICAL_FREQUENCY = "backup_periodic_freq" + const val KEY_BACKUP_PERIODICAL_TRIM = "backup_periodic_trim" const val KEY_BACKUP_PERIODICAL_COUNT = "backup_periodic_count" const val KEY_BACKUP_PERIODICAL_OUTPUT = "backup_periodic_output" const val KEY_BACKUP_PERIODICAL_LAST = "backup_periodic_last" diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/filter/ui/sheet/FilterSheetFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/filter/ui/sheet/FilterSheetFragment.kt index 53952a129..f85bd4485 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/filter/ui/sheet/FilterSheetFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/filter/ui/sheet/FilterSheetFragment.kt @@ -9,6 +9,7 @@ import android.widget.AdapterView import android.widget.ArrayAdapter import androidx.core.view.isGone import androidx.core.view.updatePadding +import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import com.google.android.material.chip.Chip import com.google.android.material.slider.RangeSlider @@ -356,5 +357,7 @@ class FilterSheetFragment : BaseAdaptiveSheet(), private const val TAG = "FilterSheet" fun show(fm: FragmentManager) = FilterSheetFragment().showDistinct(fm, TAG) + + fun isSupported(fragment: Fragment) = fragment.activity is FilterCoordinator.Owner } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/LocalListFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/LocalListFragment.kt index 170e87ec3..af638e699 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/LocalListFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/LocalListFragment.kt @@ -62,7 +62,7 @@ class LocalListFragment : MangaListFragment(), FilterCoordinator.Owner { override fun onViewBindingCreated(binding: FragmentListBinding, savedInstanceState: Bundle?) { super.onViewBindingCreated(binding, savedInstanceState) - addMenuProvider(LocalListMenuProvider(binding.root.context, childFragmentManager, this::onEmptyActionClick)) + addMenuProvider(LocalListMenuProvider(this, this::onEmptyActionClick)) addMenuProvider(MangaSearchMenuProvider(filterCoordinator, viewModel)) viewModel.onMangaRemoved.observeEvent(viewLifecycleOwner) { onItemRemoved() } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/LocalListMenuProvider.kt b/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/LocalListMenuProvider.kt index 88b560370..a1e3bd9b4 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/LocalListMenuProvider.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/LocalListMenuProvider.kt @@ -1,18 +1,17 @@ package org.koitharu.kotatsu.local.ui -import android.content.Context +import android.content.Intent import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import androidx.core.view.MenuProvider -import androidx.fragment.app.FragmentManager +import androidx.fragment.app.Fragment import org.koitharu.kotatsu.R import org.koitharu.kotatsu.filter.ui.sheet.FilterSheetFragment import org.koitharu.kotatsu.settings.storage.directories.MangaDirectoriesActivity class LocalListMenuProvider( - private val context: Context, - private val fragmentManager: FragmentManager, + private val fragment: Fragment, private val onImportClick: Function0, ) : MenuProvider { @@ -20,6 +19,11 @@ class LocalListMenuProvider( menuInflater.inflate(R.menu.opt_local, menu) } + override fun onPrepareMenu(menu: Menu) { + super.onPrepareMenu(menu) + menu.findItem(R.id.action_filter)?.isVisible = FilterSheetFragment.isSupported(fragment) + } + override fun onMenuItemSelected(menuItem: MenuItem): Boolean { return when (menuItem.itemId) { R.id.action_import -> { @@ -28,12 +32,14 @@ class LocalListMenuProvider( } R.id.action_directories -> { - context.startActivity(MangaDirectoriesActivity.newIntent(context)) + fragment.context?.run { + startActivity(Intent(this, MangaDirectoriesActivity::class.java)) + } true } R.id.action_filter -> { - FilterSheetFragment.show(fragmentManager) + FilterSheetFragment.show(fragment.childFragmentManager) true } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6eb2d8e4a..ac3d3c952 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -763,4 +763,6 @@ "]]> Access denied (403) Max number of backups + Delete old backups + Automatically delete old backup files to save storage space diff --git a/app/src/main/res/xml/pref_backup_periodic.xml b/app/src/main/res/xml/pref_backup_periodic.xml index 68c862656..06529b803 100644 --- a/app/src/main/res/xml/pref_backup_periodic.xml +++ b/app/src/main/res/xml/pref_backup_periodic.xml @@ -24,7 +24,15 @@ android:title="@string/backup_frequency" app:useSimpleSummaryProvider="true" /> + +