From dbc93c244e401b511046b7e823be936daaeece82 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Wed, 1 Jun 2022 08:02:16 +0200 Subject: [PATCH] player notification --- .../com/github/libretube/PlayerFragment.kt | 72 +++++++++++++------ .../com/github/libretube/SettingsActivity.kt | 11 ++- .../java/com/github/libretube/ThemeChanger.kt | 6 ++ 3 files changed, 65 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/github/libretube/PlayerFragment.kt b/app/src/main/java/com/github/libretube/PlayerFragment.kt index 2b637ef70..d51f79c91 100644 --- a/app/src/main/java/com/github/libretube/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/PlayerFragment.kt @@ -13,6 +13,7 @@ import android.os.Build import android.os.Build.VERSION.SDK_INT import android.os.Bundle import android.os.Environment +import android.support.v4.media.session.MediaSessionCompat import android.text.Html import android.text.TextUtils import android.util.Log @@ -57,10 +58,12 @@ import com.google.android.exoplayer2.MediaItem.fromUri import com.google.android.exoplayer2.Player import com.google.android.exoplayer2.audio.AudioAttributes import com.google.android.exoplayer2.ext.cronet.CronetDataSource +import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector import com.google.android.exoplayer2.source.DefaultMediaSourceFactory import com.google.android.exoplayer2.source.MediaSource import com.google.android.exoplayer2.source.MergingMediaSource import com.google.android.exoplayer2.source.ProgressiveMediaSource +import com.google.android.exoplayer2.ui.PlayerNotificationManager import com.google.android.exoplayer2.ui.StyledPlayerView import com.google.android.exoplayer2.upstream.DataSource import com.google.android.exoplayer2.upstream.DefaultDataSource @@ -69,12 +72,12 @@ import com.google.android.exoplayer2.util.RepeatModeUtil import com.google.android.material.button.MaterialButton import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.squareup.picasso.Picasso +import org.chromium.net.CronetEngine +import retrofit2.HttpException import java.io.IOException import java.net.URLEncoder import java.util.concurrent.Executors import kotlin.math.abs -import org.chromium.net.CronetEngine -import retrofit2.HttpException var isFullScreen = false @@ -105,6 +108,10 @@ class PlayerFragment : Fragment() { private lateinit var relDownloadVideo: LinearLayout + private lateinit var mediaSession: MediaSessionCompat + private lateinit var mediaSessionConnector: MediaSessionConnector + private lateinit var playerNotification: PlayerNotificationManager + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) arguments?.let { @@ -405,32 +412,14 @@ class PlayerFragment : Fragment() { ) } - val cronetEngine: CronetEngine = CronetHelper.getCronetEngine() - val cronetDataSourceFactory: CronetDataSource.Factory = - CronetDataSource.Factory(cronetEngine, Executors.newCachedThreadPool()) + createExoPlayer(view) - val dataSourceFactory = DefaultDataSource.Factory( - requireContext(), - cronetDataSourceFactory - ) - - val audioAttributes = AudioAttributes.Builder() - .setUsage(C.USAGE_MEDIA) - .setContentType(C.CONTENT_TYPE_MOVIE) - .build() - - exoPlayer = ExoPlayer.Builder(view.context) - .setMediaSourceFactory(DefaultMediaSourceFactory(dataSourceFactory)) - .setSeekBackIncrementMs(5000) - .setSeekForwardIncrementMs(5000) - .build() exoPlayerView.setShowSubtitleButton(true) exoPlayerView.setShowNextButton(false) exoPlayerView.setShowPreviousButton(false) exoPlayerView.setRepeatToggleModes(RepeatModeUtil.REPEAT_TOGGLE_MODE_ALL) // exoPlayerView.controllerShowTimeoutMs = 1500 exoPlayerView.controllerHideOnTouch = true - exoPlayer.setAudioAttributes(audioAttributes, true) exoPlayerView.player = exoPlayer val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) @@ -829,6 +818,47 @@ class PlayerFragment : Fragment() { run() } + private fun createExoPlayer(view: View) { + val cronetEngine: CronetEngine = CronetHelper.getCronetEngine() + val cronetDataSourceFactory: CronetDataSource.Factory = + CronetDataSource.Factory(cronetEngine, Executors.newCachedThreadPool()) + + val dataSourceFactory = DefaultDataSource.Factory( + requireContext(), + cronetDataSourceFactory + ) + + val audioAttributes = AudioAttributes.Builder() + .setUsage(C.USAGE_MEDIA) + .setContentType(C.CONTENT_TYPE_MOVIE) + .build() + + exoPlayer = ExoPlayer.Builder(view.context) + .setMediaSourceFactory(DefaultMediaSourceFactory(dataSourceFactory)) + .setSeekBackIncrementMs(5000) + .setSeekForwardIncrementMs(5000) + .build() + + exoPlayer.setAudioAttributes(audioAttributes, true) + + setMediaItem(requireContext()) + initializePlayerNotification(requireContext()) + } + + private fun setMediaItem(c: Context) { + mediaSession = MediaSessionCompat(c, this.javaClass.name) + mediaSession.isActive = true + + mediaSessionConnector = MediaSessionConnector(mediaSession) + mediaSessionConnector.setPlayer(exoPlayer) + } + + private fun initializePlayerNotification(c: Context) { + playerNotification = PlayerNotificationManager.Builder(c, 1, "background_mode").build() + playerNotification.setPlayer(exoPlayer) + playerNotification.setMediaSessionToken(mediaSession.sessionToken) + } + private fun isSubscribed(button: MaterialButton, channel_id: String) { @SuppressLint("ResourceAsColor") fun run() { diff --git a/app/src/main/java/com/github/libretube/SettingsActivity.kt b/app/src/main/java/com/github/libretube/SettingsActivity.kt index 58c4ada55..c08f31691 100644 --- a/app/src/main/java/com/github/libretube/SettingsActivity.kt +++ b/app/src/main/java/com/github/libretube/SettingsActivity.kt @@ -1,6 +1,7 @@ package com.github.libretube import android.Manifest +import android.app.NotificationManager import android.content.ContentResolver import android.content.Context import android.content.DialogInterface @@ -28,13 +29,14 @@ import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceManager import com.google.android.material.color.DynamicColors import com.google.android.material.dialog.MaterialAlertDialogBuilder +import org.json.JSONObject +import org.json.JSONTokener +import retrofit2.HttpException import java.io.IOException import java.io.InputStream import java.util.zip.ZipEntry import java.util.zip.ZipInputStream -import org.json.JSONObject -import org.json.JSONTokener -import retrofit2.HttpException + private var isCurrentViewMainSettings = true private var requireMainActivityRestart = false @@ -389,6 +391,9 @@ class SettingsActivity : .unregisterOnSharedPreferenceChangeListener(this) if (requireMainActivityRestart) { requireMainActivityRestart = false + // kill player notification + val nManager = this.getSystemService(NOTIFICATION_SERVICE) as NotificationManager + nManager.cancelAll() restartMainActivity(this) finishAffinity() } else { diff --git a/app/src/main/java/com/github/libretube/ThemeChanger.kt b/app/src/main/java/com/github/libretube/ThemeChanger.kt index 0deac945f..2a05769ad 100644 --- a/app/src/main/java/com/github/libretube/ThemeChanger.kt +++ b/app/src/main/java/com/github/libretube/ThemeChanger.kt @@ -1,9 +1,11 @@ package com.github.libretube +import android.app.NotificationManager import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.pm.PackageManager +import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.preference.PreferenceManager import java.util.* @@ -79,6 +81,10 @@ fun changeIcon(context: Context, newLogoActivityAlias: String) { // Needed due to different MainActivity Aliases because of the app icons fun restartMainActivity(context: Context) { + // kill player notification + val nManager = context.getSystemService(AppCompatActivity.NOTIFICATION_SERVICE) as NotificationManager + nManager.cancelAll() + // restart to MainActivity val pm: PackageManager = context.packageManager val intent = pm.getLaunchIntentForPackage(context.packageName) intent?.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK