diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/AudioRecordingFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/AudioRecordingFragment.kt index dafd1733a07e..41c3c7510aa5 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/AudioRecordingFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/AudioRecordingFragment.kt @@ -24,7 +24,6 @@ import android.os.Bundle import android.view.View import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import com.google.android.material.button.MaterialButton import com.ichi2.anki.CrashReportService @@ -42,8 +41,6 @@ class AudioRecordingFragment : MultimediaFragment(R.layout.fragment_audio_record override val title: String get() = resources.getString(R.string.multimedia_editor_field_editing_audio) - private val viewModel: MultimediaViewModel by viewModels() - private var audioRecordingController: AudioRecordingController? = null override fun onCreate(savedInstanceState: Bundle?) { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/AudioVideoFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/AudioVideoFragment.kt index 4efd66a63076..f6348525e5b3 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/AudioVideoFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/AudioVideoFragment.kt @@ -30,7 +30,6 @@ import androidx.annotation.OptIn import androidx.annotation.StringRes import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat -import androidx.fragment.app.viewModels import androidx.media3.common.AudioAttributes import androidx.media3.common.C import androidx.media3.common.MediaItem @@ -62,8 +61,6 @@ class AudioVideoFragment : MultimediaFragment(R.layout.fragment_audio_video) { override val title: String get() = getTitleForFragment(selectedMediaOptions, requireContext()) - private val viewModel: MultimediaViewModel by viewModels() - /** * Launches an activity to pick audio or video file from the device */ diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaFragment.kt index e86f4e5583f4..56259324bb2a 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaFragment.kt @@ -23,6 +23,8 @@ import android.os.Bundle import android.text.format.Formatter import android.view.MenuItem import android.view.View +import androidx.activity.OnBackPressedCallback +import androidx.activity.addCallback import androidx.annotation.DrawableRes import androidx.annotation.LayoutRes import androidx.appcompat.app.AlertDialog @@ -31,14 +33,20 @@ import androidx.core.content.FileProvider import androidx.core.view.MenuHost import androidx.core.view.MenuProvider import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope import com.ichi2.anki.AnkiActivity import com.ichi2.anki.CrashReportService import com.ichi2.anki.R +import com.ichi2.anki.dialogs.DiscardChangesDialog import com.ichi2.anki.multimediacard.IMultimediaEditableNote import com.ichi2.anki.multimediacard.fields.IField import com.ichi2.anki.snackbar.showSnackbar +import com.ichi2.annotations.NeedsTest import com.ichi2.compat.CompatHelper.Companion.getSerializableCompat import com.ichi2.utils.show +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch import timber.log.Timber import java.io.File @@ -50,11 +58,12 @@ import java.io.File * * @param layout The layout resource ID to be inflated by this fragment. */ -// TODO: show discard dialog in case there are changes abstract class MultimediaFragment(@LayoutRes layout: Int) : Fragment(layout) { abstract val title: String + val viewModel: MultimediaViewModel by viewModels() + protected var ankiCacheDirectory: String? = null protected var indexValue: Int = 0 @@ -62,6 +71,7 @@ abstract class MultimediaFragment(@LayoutRes layout: Int) : Fragment(layout) { protected lateinit var note: IMultimediaEditableNote protected var imageUri: Uri? = null + @NeedsTest("test discard dialog shown in case there are changes") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -80,6 +90,26 @@ abstract class MultimediaFragment(@LayoutRes layout: Int) : Fragment(layout) { } } } + + val backCallback = object : OnBackPressedCallback( + enabled = viewModel.currentMultimediaPath.value != null + ) { + override fun handleOnBackPressed() { + DiscardChangesDialog.showDialog(requireContext()) { + Timber.i("MultimediaFragment:: OK button pressed to confirm discard changes") + isEnabled = false + requireActivity().onBackPressedDispatcher.onBackPressed() + } + } + } + + lifecycleScope.launch { + viewModel.currentMultimediaPath.collectLatest { value -> + backCallback.isEnabled = value != null + } + } + + requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, backCallback) } /** diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaImageFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaImageFragment.kt index ee4cecad8f14..28f50e9880c7 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaImageFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaImageFragment.kt @@ -33,7 +33,6 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.FileProvider import androidx.core.content.IntentCompat import androidx.core.os.BundleCompat -import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import com.canhub.cropper.CropException import com.google.android.material.button.MaterialButton @@ -77,8 +76,6 @@ class MultimediaImageFragment : MultimediaFragment(R.layout.fragment_multimedia_ private lateinit var imagePreview: ImageView private lateinit var imageFileSize: TextView - private val viewModel: MultimediaViewModel by viewModels() - private lateinit var selectedImageOptions: ImageOptions /**