Skip to content

Commit

Permalink
feat: show discard dialog in case multimedia changes
Browse files Browse the repository at this point in the history
  • Loading branch information
criticalAY committed Sep 29, 2024
1 parent 408718b commit 1b0b4b2
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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?) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand All @@ -50,18 +58,20 @@ 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
protected lateinit var field: IField
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)

Expand All @@ -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)
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

/**
Expand Down

0 comments on commit 1b0b4b2

Please sign in to comment.