Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 3dcf24e8 authored by Luca Stefani's avatar Luca Stefani Committed by Sebastiano Barezzi
Browse files

Twelve: Fix visualizer, hopefully for the last time

Change-Id: Id98cc3195b98767118f2f5ad425b85a3b7bd2f74
parent 50532460
Loading
Loading
Loading
Loading
+55 −54
Original line number Diff line number Diff line
@@ -26,9 +26,7 @@ import androidx.core.view.isVisible
import androidx.core.widget.NestedScrollView
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.media3.common.Player
@@ -108,53 +106,8 @@ class NowPlayingFragment : Fragment(R.layout.fragment_now_playing) {
    // Visualizer
    private val visualizerManager = NierVisualizerManager()
    private val visualizerNVDataSource by lazy { VisualizerNVDataSource() }
    private val visualizerViewLifecycleObserver = object : DefaultLifecycleObserver {
    private var isVisualizerStarted = false

        override fun onCreate(owner: LifecycleOwner) {
            visualizerManager.init(visualizerNVDataSource)

            owner.lifecycleScope.launch {
                owner.repeatOnLifecycle(Lifecycle.State.STARTED) {
                    viewModel.currentVisualizerType.collectLatest { currentVisualizerType ->
                        currentVisualizerType.factory.invoke()?.let {
                            visualizerManager.start(visualizerSurfaceView, it)
                            isVisualizerStarted = true
                        } ?: run {
                            if (isVisualizerStarted) {
                                visualizerManager.stop()
                                isVisualizerStarted = false
                            }
                        }
                    }
                }
            }
        }

        override fun onResume(owner: LifecycleOwner) {
            if (isVisualizerStarted) {
                visualizerManager.resume()
            }
        }

        override fun onPause(owner: LifecycleOwner) {
            if (isVisualizerStarted) {
                visualizerManager.pause()
            }
        }

        override fun onStop(owner: LifecycleOwner) {
            if (isVisualizerStarted) {
                visualizerManager.stop()
            }
            isVisualizerStarted = false
        }

        override fun onDestroy(owner: LifecycleOwner) {
            visualizerManager.release()
        }
    }

    // Permissions
    private val visualizerPermissionsChecker = PermissionsChecker(
        this,
@@ -163,6 +116,12 @@ class NowPlayingFragment : Fragment(R.layout.fragment_now_playing) {
        R.string.visualizer_permissions_toast,
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        visualizerManager.init(visualizerNVDataSource)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

@@ -218,8 +177,6 @@ class NowPlayingFragment : Fragment(R.layout.fragment_now_playing) {
        visualizerSurfaceView.setZOrderOnTop(true)
        visualizerSurfaceView.holder.setFormat(PixelFormat.TRANSPARENT)

        viewLifecycleOwner.lifecycle.addObserver(visualizerViewLifecycleObserver)

        // Audio information
        audioTitleTextView.isSelected = true
        artistNameTextView.isSelected = true
@@ -505,27 +462,71 @@ class NowPlayingFragment : Fragment(R.layout.fragment_now_playing) {
                }

                launch {
                    viewModel.isVisualizerEnabled.collectLatest {
                        visualizerSurfaceView.isVisible = it
                    viewModel.isVisualizerEnabled.collectLatest { isVisualizerEnabled ->
                        visualizerSurfaceView.isVisible = isVisualizerEnabled

                        if (!isVisualizerEnabled) {
                            return@collectLatest
                        }

                        if (it) {
                        visualizerPermissionsChecker.withPermissionsGranted {
                            launch {
                                visualizerNVDataSource.workFlow.collect()
                            }

                            launch {
                                viewModel.currentVisualizerType.collectLatest {
                                    it.factory.invoke()?.let { renderers ->
                                        visualizerManager.start(visualizerSurfaceView, renderers)
                                        isVisualizerStarted = true
                                    } ?: run {
                                        if (isVisualizerStarted) {
                                            visualizerManager.stop()
                                            isVisualizerStarted = false
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    override fun onResume() {
        super.onResume()
        if (isVisualizerStarted) {
            visualizerManager.resume()
        }
    }

    override fun onPause() {
        if (isVisualizerStarted) {
            visualizerManager.pause()
        }

        super.onPause()
    }

    override fun onDestroyView() {
        animator?.cancel()
        animator = null

        if (isVisualizerStarted) {
            visualizerManager.stop()
        }
        isVisualizerStarted = false

        super.onDestroyView()
    }

    override fun onDestroy() {
        visualizerManager.release()

        super.onDestroy()
    }

    companion object {
        private val decimalFormatSymbols = DecimalFormatSymbols(Locale.ROOT)