99package com.owncloud.android.ui.preview
1010
1111import android.app.Dialog
12+ import android.content.DialogInterface
1213import android.os.Build
1314import android.view.ViewGroup
1415import android.view.Window
@@ -48,7 +49,13 @@ class PreviewVideoFullscreenDialog(
4849) : Dialog(sourceView.context, R .style.Dialog_FullscreenVideo ) {
4950
5051 private val binding: DialogPreviewVideoBinding = DialogPreviewVideoBinding .inflate(layoutInflater)
52+
53+ private val playerView: PlayerView
54+ get() = binding.videoPlayer.root
55+
5156 private var playingStateListener: androidx.media3.common.Player .Listener ? = null
57+ private var externalDismissListener: DialogInterface .OnDismissListener ? = null
58+ private var wasPlayingBeforeDismiss = false
5259
5360 /* *
5461 * exoPlayer instance used for this view, either the original one or a new one in specific cases.
@@ -72,12 +79,24 @@ class PreviewVideoFullscreenDialog(
7279 mExoPlayer = getExoPlayer(nextcloudClient)
7380 if (shouldUseRotatedVideoWorkaround) {
7481 sourceExoPlayer.currentMediaItem?.let { mExoPlayer.setMediaItem(it, sourceExoPlayer.currentPosition) }
75- binding.videoPlayer .player = mExoPlayer
82+ playerView .player = mExoPlayer
7683 mExoPlayer.prepare()
7784 }
85+ super .setOnDismissListener {
86+ restoreSourcePlayer()
87+ externalDismissListener?.onDismiss(this )
88+ }
7889 handleOnBackPressed()
7990 }
8091
92+ /* *
93+ * Keeps the caller's listener instead of letting it replace the internal one, which has to run first to hand the
94+ * playback back to [sourceView].
95+ */
96+ override fun setOnDismissListener (listener : DialogInterface .OnDismissListener ? ) {
97+ externalDismissListener = listener
98+ }
99+
81100 private fun isRotatedVideo (): Boolean {
82101 val videoFormat = sourceExoPlayer.videoFormat
83102 return videoFormat != null && videoFormat.rotationDegrees != 0
@@ -88,7 +107,7 @@ class PreviewVideoFullscreenDialog(
88107 NextcloudExoPlayer
89108 .createNextcloudExoplayer(sourceView.context, nextcloudClient)
90109 .apply {
91- addListener(ExoplayerListener (sourceView.context, binding.videoPlayer , this ))
110+ addListener(ExoplayerListener (sourceView.context, playerView , this ))
92111 }
93112 } else {
94113 sourceExoPlayer
@@ -103,7 +122,7 @@ class PreviewVideoFullscreenDialog(
103122 enableImmersiveMode()
104123 keepControlsClearOfSystemBars()
105124 switchTargetViewFromSource()
106- binding.videoPlayer .setFullscreenButton(isFullscreen = true ) {
125+ playerView .setFullscreenButton(isFullscreen = true ) {
107126 activity.onBackPressedDispatcher.onBackPressed()
108127 }
109128 if (isPlaying) {
@@ -117,36 +136,37 @@ class PreviewVideoFullscreenDialog(
117136 if (shouldUseRotatedVideoWorkaround) {
118137 mExoPlayer.seekTo(sourceExoPlayer.currentPosition)
119138 } else {
120- PlayerView .switchTargetView(sourceExoPlayer, sourceView, binding.videoPlayer )
139+ PlayerView .switchTargetView(sourceExoPlayer, sourceView, playerView )
121140 }
122141 }
123142
124143 private fun handleOnBackPressed () {
125144 activity.onBackPressedDispatcher.addCallback(activity) {
126- val isPlaying = mExoPlayer.isPlaying
127- if (isPlaying ) {
145+ wasPlayingBeforeDismiss = mExoPlayer.isPlaying
146+ if (wasPlayingBeforeDismiss ) {
128147 mExoPlayer.pause()
129148 }
130- setOnDismissListener {
131- playingStateListener?.let {
132- mExoPlayer.removeListener(it)
133- }
134- switchTargetViewToSource()
135- if (isPlaying) {
136- sourceExoPlayer.play()
137- }
138- sourceView.showController()
139- }
140149 dismiss()
141150 isEnabled = false
142151 }
143152 }
144153
154+ private fun restoreSourcePlayer () {
155+ playingStateListener?.let {
156+ mExoPlayer.removeListener(it)
157+ }
158+ switchTargetViewToSource()
159+ if (wasPlayingBeforeDismiss) {
160+ sourceExoPlayer.play()
161+ }
162+ sourceView.showController()
163+ }
164+
145165 private fun switchTargetViewToSource () {
146166 if (shouldUseRotatedVideoWorkaround) {
147167 sourceExoPlayer.seekTo(mExoPlayer.currentPosition)
148168 } else {
149- PlayerView .switchTargetView(sourceExoPlayer, binding.videoPlayer , sourceView)
169+ PlayerView .switchTargetView(sourceExoPlayer, playerView , sourceView)
150170 }
151171 }
152172
@@ -165,15 +185,15 @@ class PreviewVideoFullscreenDialog(
165185 }
166186
167187 private fun keepControlsClearOfSystemBars () {
168- ViewCompat .setOnApplyWindowInsetsListener(binding.videoPlayer ) { _, windowInsets ->
169- binding.videoPlayer .applyControlsInsets(
188+ ViewCompat .setOnApplyWindowInsetsListener(playerView ) { _, windowInsets ->
189+ playerView .applyControlsInsets(
170190 windowInsets.getInsets(
171191 WindowInsetsCompat .Type .systemBars() or WindowInsetsCompat .Type .displayCutout()
172192 )
173193 )
174194 windowInsets
175195 }
176- ViewCompat .requestApplyInsets(binding.videoPlayer )
196+ ViewCompat .requestApplyInsets(playerView )
177197 }
178198
179199 companion object {
0 commit comments