Skip to content

Commit a3a7b20

Browse files
committed
Add an option to reset the status of all started shows #507
1 parent 4cf4a4d commit a3a7b20

File tree

13 files changed

+106
-8
lines changed

13 files changed

+106
-8
lines changed

app/src/main/java/de/christinecoenen/code/zapp/app/KoinModules.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package de.christinecoenen.code.zapp.app
22

3+
import androidx.preference.PreferenceFragmentCompat
34
import de.christinecoenen.code.zapp.app.livestream.api.IZappBackendApiService
45
import de.christinecoenen.code.zapp.app.livestream.api.ZappBackendApiServiceFactory
56
import de.christinecoenen.code.zapp.app.livestream.repository.ProgramInfoRepository
@@ -29,6 +30,7 @@ import de.christinecoenen.code.zapp.repositories.ChannelRepository
2930
import de.christinecoenen.code.zapp.repositories.MediathekRepository
3031
import de.christinecoenen.code.zapp.repositories.SearchRepository
3132
import de.christinecoenen.code.zapp.utils.api.UserAgentInterceptor
33+
import de.christinecoenen.code.zapp.utils.system.PreferenceFragmentHelper
3234
import io.noties.markwon.Markwon
3335
import kotlinx.coroutines.MainScope
3436
import okhttp3.OkHttpClient
@@ -75,6 +77,13 @@ class KoinModules {
7577
} bind IMediathekApiService::class
7678
single { ProgramInfoRepository(get()) }
7779
single { DownloadFileInfoManager(get(), get()) }
80+
factory { (preferenceFragment: PreferenceFragmentCompat) ->
81+
PreferenceFragmentHelper(
82+
preferenceFragment,
83+
get(),
84+
get()
85+
)
86+
}
7887

7988
factory { SettingsRepository(androidContext()) }
8089
factory { Player(androidContext(), get(), get(), get()) }
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package de.christinecoenen.code.zapp.app.settings.ui
2+
3+
import android.app.Dialog
4+
import android.os.Bundle
5+
import androidx.appcompat.app.AppCompatDialogFragment
6+
import androidx.fragment.app.setFragmentResult
7+
import com.google.android.material.dialog.MaterialAlertDialogBuilder
8+
import de.christinecoenen.code.zapp.R
9+
10+
class ConfirmResetPlaybackPositionsDialog : AppCompatDialogFragment() {
11+
12+
companion object {
13+
const val REQUEST_KEY_CONFIRMED = "REQUEST_KEY_CONFIRMED"
14+
}
15+
16+
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
17+
return MaterialAlertDialogBuilder(requireActivity())
18+
.setTitle(R.string.pref_dialog_confirm_reset_playback_position_title)
19+
.setMessage(R.string.pref_dialog_confirm_reset_playback_position_text)
20+
.setIcon(R.drawable.ic_outline_play_circle_24)
21+
.setNegativeButton(android.R.string.cancel, null)
22+
.setPositiveButton(android.R.string.ok) { _, _ ->
23+
setFragmentResult(REQUEST_KEY_CONFIRMED, Bundle())
24+
}
25+
.create()
26+
}
27+
}

app/src/main/java/de/christinecoenen/code/zapp/app/settings/ui/SettingsFragment.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ import android.os.Bundle
44
import androidx.navigation.fragment.findNavController
55
import androidx.preference.Preference
66
import de.christinecoenen.code.zapp.R
7-
import de.christinecoenen.code.zapp.app.settings.repository.SettingsRepository
87
import de.christinecoenen.code.zapp.utils.system.PreferenceFragmentHelper
98
import org.koin.android.ext.android.inject
9+
import org.koin.core.parameter.parametersOf
1010

1111
class SettingsFragment : BaseSettingsFragment() {
1212

13-
private val settingsRepository: SettingsRepository by inject()
14-
private val preferenceFragmentHelper = PreferenceFragmentHelper(this, settingsRepository)
13+
private val preferenceFragmentHelper: PreferenceFragmentHelper by inject { parametersOf(this) }
1514

1615
private val channelSelectionClickListener = Preference.OnPreferenceClickListener {
1716
val direction =

app/src/main/java/de/christinecoenen/code/zapp/persistence/MediathekShowDao.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,9 @@ interface MediathekShowDao {
166166
@Query("UPDATE PersistedMediathekShow SET playbackPosition=0 WHERE apiId=:apiId")
167167
suspend fun resetPlaybackPosition(apiId: String)
168168

169+
@Query("UPDATE PersistedMediathekShow SET playbackPosition=0")
170+
suspend fun resetAllPlaybackPositions()
171+
169172
@Query("SELECT playbackPosition FROM PersistedMediathekShow WHERE id=:id")
170173
suspend fun getPlaybackPosition(id: Int): Long
171174

app/src/main/java/de/christinecoenen/code/zapp/repositories/MediathekRepository.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,12 @@ class MediathekRepository(private val database: Database) {
244244
.resetPlaybackPosition(apiId)
245245
}
246246

247+
suspend fun resetAllPlaybackPositions() = withContext(Dispatchers.IO) {
248+
database
249+
.mediathekShowDao()
250+
.resetAllPlaybackPositions()
251+
}
252+
247253
fun getPlaybackPositionPercent(apiId: String): Flow<Float> {
248254
return database
249255
.mediathekShowDao()

app/src/main/java/de/christinecoenen/code/zapp/tv/settings/PreferenceFragment.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@ package de.christinecoenen.code.zapp.tv.settings
33
import android.os.Bundle
44
import androidx.leanback.preference.LeanbackPreferenceFragmentCompat
55
import de.christinecoenen.code.zapp.R
6-
import de.christinecoenen.code.zapp.app.settings.repository.SettingsRepository
76
import de.christinecoenen.code.zapp.utils.system.PreferenceFragmentHelper
87
import org.koin.android.ext.android.inject
8+
import org.koin.core.parameter.parametersOf
99

1010
class PreferenceFragment : LeanbackPreferenceFragmentCompat() {
1111

12-
private val settingsRepository: SettingsRepository by inject()
13-
private val preferenceFragmentHelper = PreferenceFragmentHelper(this, settingsRepository)
12+
private val preferenceFragmentHelper: PreferenceFragmentHelper by inject { parametersOf(this) }
1413

1514
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
1615
setPreferencesFromResource(R.xml.tv_preferences, rootKey)

app/src/main/java/de/christinecoenen/code/zapp/utils/system/PreferenceFragmentHelper.kt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package de.christinecoenen.code.zapp.utils.system
22

3+
import android.widget.Toast
34
import androidx.appcompat.app.AppCompatDelegate
45
import androidx.core.os.LocaleListCompat
6+
import androidx.fragment.app.setFragmentResultListener
57
import androidx.lifecycle.DefaultLifecycleObserver
68
import androidx.lifecycle.LifecycleOwner
79
import androidx.preference.ListPreference
@@ -11,14 +13,20 @@ import androidx.preference.PreferenceFragmentCompat
1113
import androidx.preference.SwitchPreferenceCompat
1214
import com.google.android.material.color.DynamicColors
1315
import com.jakewharton.processphoenix.ProcessPhoenix
16+
import de.christinecoenen.code.zapp.R
17+
import de.christinecoenen.code.zapp.app.mediathek.ui.dialogs.ConfirmDeleteDownloadDialog
1418
import de.christinecoenen.code.zapp.app.settings.helper.ShortcutPreference
1519
import de.christinecoenen.code.zapp.app.settings.repository.SettingsRepository
20+
import de.christinecoenen.code.zapp.app.settings.ui.ConfirmResetPlaybackPositionsDialog
21+
import de.christinecoenen.code.zapp.repositories.MediathekRepository
22+
import de.christinecoenen.code.zapp.utils.system.LifecycleOwnerHelper.launchOnCreated
1623
import java.util.Timer
1724
import kotlin.concurrent.schedule
1825

1926
class PreferenceFragmentHelper(
2027
private val preferenceFragment: PreferenceFragmentCompat,
2128
private val settingsRepository: SettingsRepository,
29+
private val mediathekRepository: MediathekRepository,
2230
) : DefaultLifecycleObserver {
2331

2432
companion object {
@@ -28,6 +36,7 @@ class PreferenceFragmentHelper(
2836
private const val PREF_UI_MODE = "pref_ui_mode"
2937
private const val PREF_LANGUAGE = "pref_key_language"
3038
private const val PREF_CHANNEL_SELECTION = "pref_key_channel_selection"
39+
private const val PREF_DELETE_STARTED_SHOWS = "pref_key_delete_started_shows"
3140

3241
}
3342

@@ -36,9 +45,30 @@ class PreferenceFragmentHelper(
3645
private var uiModePreference: ListPreference? = null
3746
private var languagePreference: ListPreference? = null
3847
private var channelSelectionPreference: Preference? = null
48+
private var deleteStartedShowsPreference: Preference? = null
3949

4050
private var channelSelectionClickListener: OnPreferenceClickListener? = null
4151

52+
private var deleteStartedShowsClickListener: OnPreferenceClickListener? =
53+
OnPreferenceClickListener {
54+
val dialog = ConfirmResetPlaybackPositionsDialog()
55+
56+
preferenceFragment.setFragmentResultListener(ConfirmDeleteDownloadDialog.REQUEST_KEY_CONFIRMED) { _, _ ->
57+
preferenceFragment.launchOnCreated {
58+
mediathekRepository.resetAllPlaybackPositions()
59+
Toast.makeText(
60+
preferenceFragment.requireContext(),
61+
R.string.pref_dialog_confirm_reset_playback_position_success_toast,
62+
Toast.LENGTH_SHORT
63+
).show()
64+
}
65+
}
66+
67+
dialog.show(preferenceFragment.parentFragmentManager, null)
68+
69+
true
70+
}
71+
4272
private val dynamicColorChangeListener = Preference.OnPreferenceChangeListener { _, _ ->
4373
// Delay to wait for pereferences to be persisted (on very fast devices)
4474
// before killing the app - there is no listener that fires *after* persisting.
@@ -73,6 +103,7 @@ class PreferenceFragmentHelper(
73103
uiModePreference = preferenceScreen.findPreference(PREF_UI_MODE)
74104
languagePreference = preferenceScreen.findPreference(PREF_LANGUAGE)
75105
channelSelectionPreference = preferenceScreen.findPreference(PREF_CHANNEL_SELECTION)
106+
deleteStartedShowsPreference = preferenceScreen.findPreference(PREF_DELETE_STARTED_SHOWS)
76107

77108
languagePreference?.let {
78109
val languages =
@@ -102,6 +133,7 @@ class PreferenceFragmentHelper(
102133
uiModePreference?.onPreferenceChangeListener = uiModeChangeListener
103134
languagePreference?.onPreferenceChangeListener = languageChangeListener
104135
channelSelectionPreference?.onPreferenceClickListener = channelSelectionClickListener
136+
deleteStartedShowsPreference?.onPreferenceClickListener = deleteStartedShowsClickListener
105137
}
106138

107139
override fun onDestroy(owner: LifecycleOwner) {
@@ -112,5 +144,6 @@ class PreferenceFragmentHelper(
112144
uiModePreference?.onPreferenceChangeListener = null
113145
languagePreference?.onPreferenceChangeListener = null
114146
channelSelectionPreference?.onPreferenceClickListener = null
147+
deleteStartedShowsPreference?.onPreferenceClickListener = null
115148
}
116149
}

app/src/main/res/raw-en/changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# v-next
2+
* Added an option to reset the progress of all started shows ([#507](https://github.com/mediathekview/zapp/issues/507))
23
* Fixed channel order list being covered by the navigation bar ([#496](https://github.com/mediathekview/zapp/issues/496))
34
* Restricted local result list for the mediathek search ([#486](https://github.com/mediathekview/zapp/issues/486))
45

app/src/main/res/raw/changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# v-next
2+
* Option hinzugefügt, um den Fortschritt aller angefangenen Videos zurückzusetzen ([#507](https://github.com/mediathekview/zapp/issues/507))
23
* Behoben, dass die Sender-Anordnen-Liste von der Navigation überdeckt wird ([#496](https://github.com/mediathekview/zapp/issues/496))
34
* Lokale Ergebnisliste in der Mediathek-Suche begrenzt ([#486](https://github.com/mediathekview/zapp/issues/486))
45

app/src/main/res/values-en/strings.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,12 +170,19 @@
170170
<string name="pref_download_to_sd_card_title">Download to sd card</string>
171171
<string name="pref_download_to_sd_card_summary">Video files will be saved to sd card if present.</string>
172172

173+
<string name="pref_delete_started_shows_title">Reset started shows</string>
174+
<string name="pref_delete_started_shows_summary">Deletes the progress of all shows you started or finished watching.</string>
175+
173176
<string name="pref_dynamic_colors">Dynamic colors</string>
174177
<string name="pref_dynamic_colors_summary">Choose accent colors based on the wallpaper.</string>
175178

176179
<string name="pref_detail_search_history_title">Search history</string>
177180
<string name="pref_detail_search_history_summary">Remember the most recent search queries.</string>
178181

182+
<string name="pref_dialog_confirm_reset_playback_position_title">Reset started shows?</string>
183+
<string name="pref_dialog_confirm_reset_playback_position_text">Deletes the progress of all shows you started or finished watching. No downloads will be deleted.</string>
184+
<string name="pref_dialog_confirm_reset_playback_position_success_toast">Successfully reset all started shows</string>
185+
179186
<!-- notifications -->
180187
<string name="notification_channel_name_background_playback">Background player</string>
181188
<string name="notification_channel_name_download_progress">Download progress</string>

0 commit comments

Comments
 (0)