Skip to content

Commit

Permalink
Merge branch 'feature/media3' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
cemrich committed Jul 26, 2023
2 parents 8884a5b + bf3f915 commit f9262a9
Show file tree
Hide file tree
Showing 30 changed files with 84 additions and 136 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,4 @@ gradle-app.setting

/app/release
/app/releases
/prototype.txt
14 changes: 7 additions & 7 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -145,13 +145,13 @@ dependencies {
implementation "androidx.work:work-runtime-ktx:$work_version"

// exo player
def exoplayer_version = "2.19.0"
implementation "com.google.android.exoplayer:exoplayer-core:$exoplayer_version"
implementation "com.google.android.exoplayer:exoplayer-hls:$exoplayer_version"
implementation "com.google.android.exoplayer:exoplayer-ui:$exoplayer_version"
implementation "com.google.android.exoplayer:extension-mediasession:$exoplayer_version"
implementation "com.google.android.exoplayer:extension-leanback:$exoplayer_version"
implementation "com.google.android.exoplayer:extension-okhttp:$exoplayer_version"
def media3_version = "1.1.0"
implementation "androidx.media3:media3-exoplayer:$media3_version"
implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
implementation "androidx.media3:media3-ui:$media3_version"
implementation "androidx.media3:media3-ui-leanback:$media3_version"
implementation "androidx.media3:media3-session:$media3_version"
implementation "androidx.media3:media3-datasource-okhttp:$media3_version"

// retrofit rest client
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
Expand Down
6 changes: 4 additions & 2 deletions app/lint.xml
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--suppress XmlUnboundNsPrefix -->
<lint>
<issue id="UnusedResources">
<issue id="UnusedResources">
<ignore path="**/channel_logo_swr.png" />
<ignore path="**/channel_logo_tagesschau24.png" />
</issue>
<issue id="UnsafeOptInUsageError">
<ignore regexp='\(markerClass = androidx\.media3\.common\.util\.UnstableApi\.class\)' />
</issue>
</lint>
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ abstract class ZappApplicationBase : Application() {

private lateinit var koin: Koin

@Suppress("unused")
fun reportError(throwable: Throwable?) {
if (ACRA.isInitialised) {
ACRA.errorReporter.handleException(throwable)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package de.christinecoenen.code.zapp.app.livestream.api.model
import androidx.annotation.Keep

@Keep
@Suppress("unused")
enum class Channel(private val id: String) {

DAS_ERSTE("das_erste"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ class ShowResponse(
get() = shows!![0]

val isSuccess: Boolean
get() = shows != null && shows.isNotEmpty()
get() = !shows.isNullOrEmpty()
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import androidx.core.view.isVisible
import de.christinecoenen.code.zapp.R
import de.christinecoenen.code.zapp.app.livestream.ui.ProgramInfoViewModel
import de.christinecoenen.code.zapp.app.player.AbstractPlayerActivity
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import androidx.core.view.MenuProvider
import androidx.core.view.isVisible
import androidx.navigation.NavController
import androidx.navigation.NavDestination
import androidx.navigation.NavGraph
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.*
import androidx.preference.PreferenceManager
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,8 @@ import java.io.Serializable
@Keep
class QueryRequest : Serializable {

@Suppress("unused")
private val sortBy: String = "timestamp"

@Suppress("unused")
private val sortOrder: String = "desc"

@Suppress("unused")
private val future: Boolean = true

var offset: Int = 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ class DownloadFileInfoManager(
} else {
val resolver = applicationContext.contentResolver

@Suppress("NON_EXHAUSTIVE_WHEN")
when (status) {
DownloadStatus.DELETED,
DownloadStatus.FAILED -> try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.setFragmentResultListener
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.google.android.material.snackbar.Snackbar
Expand All @@ -29,7 +28,11 @@ import de.christinecoenen.code.zapp.utils.system.IntentHelper.openUrl
import de.christinecoenen.code.zapp.utils.system.LifecycleOwnerHelper.launchOnCreated
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.transform
import org.koin.android.ext.android.inject
import timber.log.Timber
import kotlin.time.Duration.Companion.milliseconds
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package de.christinecoenen.code.zapp.app.mediathek.ui.list

import android.os.Bundle
import android.view.*
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback
import androidx.core.view.MenuProvider
import androidx.core.view.isVisible
Expand All @@ -19,9 +24,9 @@ import com.google.android.material.chip.Chip
import de.christinecoenen.code.zapp.R
import de.christinecoenen.code.zapp.app.mediathek.api.request.MediathekChannel
import de.christinecoenen.code.zapp.app.mediathek.api.result.QueryInfoResult
import de.christinecoenen.code.zapp.app.mediathek.ui.helper.ShowMenuHelper
import de.christinecoenen.code.zapp.app.mediathek.ui.list.adapter.FooterLoadStateAdapter
import de.christinecoenen.code.zapp.app.mediathek.ui.list.adapter.MediathekShowListItemListener
import de.christinecoenen.code.zapp.app.mediathek.ui.helper.ShowMenuHelper
import de.christinecoenen.code.zapp.app.mediathek.ui.list.adapter.PagedMediathekShowListAdapter
import de.christinecoenen.code.zapp.databinding.MediathekListFragmentBinding
import de.christinecoenen.code.zapp.databinding.ViewNoShowsBinding
Expand All @@ -31,12 +36,12 @@ import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.drop
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import org.koin.androidx.viewmodel.ext.android.viewModel
import java.net.UnknownServiceException
import java.text.DateFormat
import java.text.NumberFormat
import java.util.*
import java.util.Date
import java.util.Locale
import javax.net.ssl.SSLHandshakeException


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ sealed class UiModel {

class MediathekShowModel(
val show: MediathekShow,
val date: DateTime
date: DateTime
) : UiModel() {

val localDate = LocalDate(date)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import androidx.core.view.MenuProvider
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.core.view.isVisible
import com.google.android.exoplayer2.ui.StyledPlayerView
import androidx.media3.ui.PlayerView
import de.christinecoenen.code.zapp.R
import de.christinecoenen.code.zapp.app.player.BackgroundPlayerService.Companion.bind
import de.christinecoenen.code.zapp.app.settings.repository.SettingsRepository
Expand All @@ -30,7 +30,7 @@ import timber.log.Timber
abstract class AbstractPlayerActivity :
AppCompatActivity(),
MenuProvider,
StyledPlayerView.ControllerVisibilityListener,
PlayerView.ControllerVisibilityListener,
SleepTimer.Listener {

private val viewModel: AbstractPlayerActivityViewModel by viewModel()
Expand Down Expand Up @@ -199,36 +199,6 @@ abstract class AbstractPlayerActivity :
}
}

override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
return when (keyCode) {
KeyEvent.KEYCODE_MEDIA_STEP_BACKWARD, KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD, KeyEvent.KEYCODE_MEDIA_REWIND -> {
player?.rewind()
true
}
KeyEvent.KEYCODE_MEDIA_STEP_FORWARD, KeyEvent.KEYCODE_MEDIA_SKIP_FORWARD, KeyEvent.KEYCODE_MEDIA_FAST_FORWARD -> {
player?.fastForward()
true
}
KeyEvent.KEYCODE_DPAD_CENTER, KeyEvent.KEYCODE_MEDIA_TOP_MENU -> {
binding.video.toggleControls()
true
}
KeyEvent.KEYCODE_MEDIA_PLAY -> {
resumeActivity()
true
}
KeyEvent.KEYCODE_MEDIA_PAUSE -> {
pauseActivity()
true
}
KeyEvent.KEYCODE_MEDIA_CLOSE -> {
finish()
true
}
else -> super.onKeyUp(keyCode, event)
}
}

override fun onVisibilityChanged(visibility: Int) {
if (binding.video.isControllerFullyVisible) {
showSystemUi()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package de.christinecoenen.code.zapp.app.player
import android.app.Notification
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.Service
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
Expand All @@ -14,10 +13,10 @@ import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleService
import androidx.lifecycle.lifecycleScope
import com.google.android.exoplayer2.ui.DefaultMediaDescriptionAdapter
import com.google.android.exoplayer2.ui.PlayerNotificationManager
import com.google.android.exoplayer2.ui.PlayerNotificationManager.BitmapCallback
import com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter
import androidx.media3.ui.DefaultMediaDescriptionAdapter
import androidx.media3.ui.PlayerNotificationManager
import androidx.media3.ui.PlayerNotificationManager.BitmapCallback
import androidx.media3.ui.PlayerNotificationManager.MediaDescriptionAdapter
import de.christinecoenen.code.zapp.R
import de.christinecoenen.code.zapp.utils.system.LifecycleOwnerHelper.launchOnCreated
import de.christinecoenen.code.zapp.utils.system.NotificationHelper
Expand Down Expand Up @@ -87,7 +86,7 @@ class BackgroundPlayerService : LifecycleService(),
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
super.onStartCommand(intent, flags, startId)
handleIntent(intent)
return Service.START_STICKY
return START_STICKY
}

override fun onTaskRemoved(rootIntent: Intent) {
Expand Down Expand Up @@ -169,7 +168,7 @@ class BackgroundPlayerService : LifecycleService(),
private fun movePlaybackToForeground() {
isPlaybackInBackground = false

stopForeground(Service.STOP_FOREGROUND_REMOVE)
stopForeground(STOP_FOREGROUND_REMOVE)
stopSelf()

playerNotificationManager?.apply {
Expand Down Expand Up @@ -207,26 +206,26 @@ class BackgroundPlayerService : LifecycleService(),
it.setColor(ContextCompat.getColor(this, R.color.colorPrimaryDark))
it.setColorized(true)
it.setPlayer(player.exoPlayer)
it.setMediaSessionToken(player.mediaSession.sessionToken)
it.setMediaSessionToken(player.mediaSession.sessionCompatToken)
}
}

override fun getCurrentContentTitle(player: com.google.android.exoplayer2.Player): String {
override fun getCurrentContentTitle(player: androidx.media3.common.Player): String {
return this.player.currentVideoInfo!!.title
}

override fun createCurrentContentIntent(player: com.google.android.exoplayer2.Player): PendingIntent {
override fun createCurrentContentIntent(player: androidx.media3.common.Player): PendingIntent {
Timber.i("createCurrentContentIntent: %s", foregroundActivityIntent!!.component)

// a notification click will bring us back to the activity that launched it
return getNotificationCLickedPendingIntent()
}

override fun getCurrentContentText(player: com.google.android.exoplayer2.Player): String? =
override fun getCurrentContentText(player: androidx.media3.common.Player): String? =
this.player.currentVideoInfo!!.subtitle

override fun getCurrentLargeIcon(
player: com.google.android.exoplayer2.Player,
player: androidx.media3.common.Player,
callback: BitmapCallback
): Bitmap? = null

Expand All @@ -238,7 +237,7 @@ class BackgroundPlayerService : LifecycleService(),
if (ongoing) {
startForeground(notificationId, notification)
} else {
stopForeground(Service.STOP_FOREGROUND_REMOVE)
stopForeground(STOP_FOREGROUND_REMOVE)
}
}

Expand Down
39 changes: 11 additions & 28 deletions app/src/main/java/de/christinecoenen/code/zapp/app/player/Player.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,15 @@ package de.christinecoenen.code.zapp.app.player

import android.content.Context
import android.net.Uri
import android.support.v4.media.session.MediaSessionCompat
import android.view.View
import com.google.android.exoplayer2.C
import com.google.android.exoplayer2.ExoPlayer
import com.google.android.exoplayer2.MediaItem
import com.google.android.exoplayer2.MediaMetadata
import com.google.android.exoplayer2.audio.AudioAttributes
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
import com.google.android.exoplayer2.ui.StyledPlayerView
import com.google.android.exoplayer2.upstream.DefaultDataSource
import com.google.android.exoplayer2.util.MimeTypes
import androidx.media3.common.*
import androidx.media3.datasource.DefaultDataSource
import androidx.media3.datasource.okhttp.OkHttpDataSource
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector
import androidx.media3.session.MediaSession
import androidx.media3.ui.PlayerView
import de.christinecoenen.code.zapp.R
import de.christinecoenen.code.zapp.app.player.VideoInfoArtworkExtensions.getArtworkByteArray
import de.christinecoenen.code.zapp.app.settings.repository.SettingsRepository
Expand Down Expand Up @@ -49,7 +44,7 @@ class Player(
}

val exoPlayer: ExoPlayer
val mediaSession: MediaSessionCompat
val mediaSession: MediaSession
val sleepTimer = SleepTimer { pause() }

var currentVideoInfo: VideoInfo? = null
Expand Down Expand Up @@ -120,11 +115,7 @@ class Player(
.build()

// media session setup
mediaSession = MediaSessionCompat(context, context.packageName)

val mediaSessionConnector = MediaSessionConnector(mediaSession)
mediaSessionConnector.setPlayer(exoPlayer)
mediaSession.isActive = true
mediaSession = MediaSession.Builder(context, exoPlayer).build()

// set listeners
networkConnectionHelper.startListenForNetworkChanges(::loadStreamQualityByNetworkType)
Expand All @@ -137,7 +128,7 @@ class Player(
}
}

fun setView(videoView: StyledPlayerView) {
fun setView(videoView: PlayerView) {
videoView.player = exoPlayer
screenDimmingHandler.setScreenToKeepOn(videoView)
}
Expand Down Expand Up @@ -175,14 +166,6 @@ class Player(
exoPlayer.playWhenReady = true
}

fun rewind() {
exoPlayer.seekBack()
}

fun fastForward() {
exoPlayer.seekForward()
}

suspend fun destroy() = withContext(Dispatchers.Main) {
networkConnectionHelper.endListenForNetworkChanges()
playerPositionWatcher.dispose()
Expand Down
Loading

0 comments on commit f9262a9

Please sign in to comment.