From cc14648099a0edbf8fcb2fd46ad804df59336f94 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sat, 20 Feb 2021 09:46:29 -0700 Subject: [PATCH] Fix file intent issue Fix a problem where the file intent wouldnt work on any fragment that wasnt MainFragment. --- .../java/org/oxycblt/auxio/MainActivity.kt | 8 ++++++ .../java/org/oxycblt/auxio/MainFragment.kt | 4 --- .../auxio/playback/PlaybackFragment.kt | 8 ++++++ .../auxio/playback/PlaybackViewModel.kt | 19 +++++++++++--- .../auxio/playback/queue/QueueFragment.kt | 12 +++++++++ .../auxio/playback/system/PlaybackService.kt | 26 +++++++++---------- 6 files changed, 56 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt index f0fc6d46c..a12010c79 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt @@ -53,6 +53,14 @@ class MainActivity : AppCompatActivity() { // We have to manually push the intent whenever we get one so that MainFragment // can catch any file intents setIntent(intent) + + // TODO: Idea Needed + // Move to all non-loading fragments + // Use ext fun + // Apply bool to intent to make sure it doesnt fire again??? + // Need it to + // - Run everywhere except loading + // - Dont fire after the first go } @Suppress("DEPRECATION") diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index f814e1138..6d99bf706 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -126,10 +126,6 @@ class MainFragment : Fragment() { // TODO?: Add an option to view it instead of play it if this becomes too annoying if (intent != null && intent.action == Intent.ACTION_VIEW) { playbackModel.playWithIntent(intent, requireContext()) - - // Clear intent so that this does not fire again - // I see no consequences from doing this - activity.intent = null } else { playbackModel.restorePlaybackIfNeeded(requireContext()) } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt index 821be2577..f5573f02f 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt @@ -1,5 +1,6 @@ package org.oxycblt.auxio.playback +import android.content.Intent import android.content.res.ColorStateList import android.os.Bundle import android.view.LayoutInflater @@ -200,6 +201,13 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { playbackModel.enableAnimation() } + + val intent = requireActivity().intent + + // If the intent of the activity is a file intent, then play it. + if (intent != null && intent.action == Intent.ACTION_VIEW) { + playbackModel.playWithIntent(intent, requireContext()) + } } // --- SEEK CALLBACKS --- diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt index 89b6acc22..d2f73c167 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt @@ -160,11 +160,18 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback { /** Play a song using an intent */ fun playWithIntent(intent: Intent, context: Context) { - val uri = intent.data ?: return + val fired = intent.getBooleanExtra(KEY_INTENT_PLAY_FIRED, false) - viewModelScope.launch { - musicStore.getSongForUri(uri, context.contentResolver)?.let { song -> - playSong(song) + if (!fired) { + // Make sure any intents that are passed here never fire again + intent.putExtra(KEY_INTENT_PLAY_FIRED, true) + + val uri = intent.data ?: return + + viewModelScope.launch { + musicStore.getSongForUri(uri, context.contentResolver)?.let { song -> + playSong(song) + } } } } @@ -420,4 +427,8 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback { override fun onInUserQueueUpdate(isInUserQueue: Boolean) { mIsInUserQueue.value = isInUserQueue } + + companion object { + private const val KEY_INTENT_PLAY_FIRED = "KEY_PLAY_DONE" + } } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt index 7c5188948..644b0b6e8 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt @@ -1,5 +1,6 @@ package org.oxycblt.auxio.playback.queue +import android.content.Intent import android.os.Build import android.os.Bundle import android.view.LayoutInflater @@ -98,6 +99,17 @@ class QueueFragment : Fragment() { return binding.root } + override fun onResume() { + super.onResume() + + val intent = requireActivity().intent + + // If the intent of the activity is a file intent, then play it. + if (intent != null && intent.action == Intent.ACTION_VIEW) { + playbackModel.playWithIntent(intent, requireContext()) + } + } + /** * Create the queue data that should be displayed * @return The list of headers/songs that should be displayed. diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt index 8041207b5..e62620939 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt @@ -11,7 +11,6 @@ import android.content.pm.ServiceInfo import android.media.AudioManager import android.os.Build import android.os.IBinder -import android.os.Parcelable import android.support.v4.media.MediaMetadataCompat import android.support.v4.media.session.MediaSessionCompat import android.view.KeyEvent @@ -73,9 +72,7 @@ class PlaybackService : Service(), Player.EventListener, PlaybackStateManager.Ca private var isForeground = false private val serviceJob = Job() - private val serviceScope = CoroutineScope( - serviceJob + Dispatchers.Main - ) + private val serviceScope = CoroutineScope(serviceJob + Dispatchers.Main) // --- SERVICE OVERRIDES --- @@ -257,13 +254,11 @@ class PlaybackService : Service(), Player.EventListener, PlaybackStateManager.Ca } override fun onShuffleUpdate(isShuffling: Boolean) { - if (!settingsManager.useAltNotifAction) { - return + if (settingsManager.useAltNotifAction) { + notification.setShuffle(this, isShuffling) + + startForegroundOrNotify() } - - notification.setShuffle(this, isShuffling) - - startForegroundOrNotify() } override fun onSeek(position: Long) { @@ -312,7 +307,8 @@ class PlaybackService : Service(), Player.EventListener, PlaybackStateManager.Ca * Create the [SimpleExoPlayer] instance. */ private fun newPlayer(): SimpleExoPlayer { - // Since Auxio is a music player, only specify an audio renderer to save battery/apk size/cache size. + // Since Auxio is a music player, only specify an audio renderer to save + // battery/apk size/cache size val audioRenderer = RenderersFactory { handler, _, audioListener, _, _ -> arrayOf( MediaCodecAudioRenderer( @@ -445,9 +441,9 @@ class PlaybackService : Service(), Player.EventListener, PlaybackStateManager.Ca * Handle a media button intent. */ private fun handleMediaButtonEvent(event: Intent): Boolean { - val item = event.getParcelableExtra(Intent.EXTRA_KEY_EVENT) as KeyEvent + val item = event.getParcelableExtra(Intent.EXTRA_KEY_EVENT) - if (item.action == KeyEvent.ACTION_DOWN) { + if (item != null && item.action == KeyEvent.ACTION_DOWN) { return when (item.keyCode) { // Play/Pause if any of the keys are play/pause KeyEvent.KEYCODE_MEDIA_PAUSE, KeyEvent.KEYCODE_MEDIA_PLAY, @@ -518,6 +514,10 @@ class PlaybackService : Service(), Player.EventListener, PlaybackStateManager.Ca stopForegroundAndNotification() } + Intent.ACTION_VIEW -> { + logD("wat this works") + } + // --- HEADSET CASES --- BluetoothDevice.ACTION_ACL_CONNECTED -> resumeFromPlug()