1
0
Fork 0
mirror of https://github.com/MatomoCamp/matomocamp-companion-android.git synced 2024-09-19 16:13:46 +02:00

WIP VideoPlayerActivity

This commit is contained in:
Christophe Beyls 2020-12-25 14:26:39 +01:00
parent 4e8959ce84
commit 44f75b205e
7 changed files with 159 additions and 1 deletions

View file

@ -31,6 +31,9 @@ android {
}
buildTypes {
debug {
multiDexEnabled true
}
release {
minifyEnabled true
shrinkResources true
@ -70,6 +73,7 @@ dependencies {
def lifecycle_version = "2.2.0"
def room_version = "2.2.6"
def okhttp_version = "3.12.12"
def exoplayer_version = "2.12.2"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1'
implementation 'androidx.core:core-ktx:1.3.2'
@ -95,4 +99,7 @@ dependencies {
implementation 'com.squareup.okio:okio:2.9.0'
implementation 'com.squareup.moshi:moshi:1.11.0'
implementation 'com.github.chrisbanes:PhotoView:2.3.0'
implementation "com.google.android.exoplayer:exoplayer-core:$exoplayer_version"
implementation "com.google.android.exoplayer:extension-okhttp:$exoplayer_version"
implementation "com.google.android.exoplayer:exoplayer-ui:$exoplayer_version"
}

View file

@ -109,6 +109,7 @@
<category android:name="android.intent.category.NOTIFICATION_PREFERENCES" />
</intent-filter>
</activity>
<activity android:name=".activities.VideoPlayerActivity" />
<receiver
android:name=".receivers.AlarmReceiver"

View file

@ -0,0 +1,93 @@
package be.digitalia.fosdem.activities
import android.content.Context
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import be.digitalia.fosdem.R
import be.digitalia.fosdem.utils.network.HttpUtils
import com.google.android.exoplayer2.DefaultLoadControl
import com.google.android.exoplayer2.DefaultRenderersFactory
import com.google.android.exoplayer2.MediaItem
import com.google.android.exoplayer2.RenderersFactory
import com.google.android.exoplayer2.SimpleExoPlayer
import com.google.android.exoplayer2.analytics.AnalyticsCollector
import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer
import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSourceFactory
import com.google.android.exoplayer2.extractor.ExtractorsFactory
import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor
import com.google.android.exoplayer2.extractor.mp4.Mp4Extractor
import com.google.android.exoplayer2.extractor.ogg.OggExtractor
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector
import com.google.android.exoplayer2.source.DrmFreeProgressiveMediaSourceFactory
import com.google.android.exoplayer2.source.MediaSourceFactory
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
import com.google.android.exoplayer2.ui.PlayerView
import com.google.android.exoplayer2.upstream.DataSource
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter
import com.google.android.exoplayer2.util.Clock
import com.google.android.exoplayer2.video.MediaCodecVideoRenderer
class VideoPlayerActivity : AppCompatActivity(R.layout.player) {
private val player: SimpleExoPlayer by lazy(LazyThreadSafetyMode.NONE) {
createSimpleExoPlayer(this)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val playerView: PlayerView = findViewById(R.id.player_view)
val uri = intent.getStringExtra(EXTRA_URI)!!
val mediaItem: MediaItem = MediaItem.fromUri(uri)
with(player) {
playerView.player = this
setMediaItem(mediaItem)
prepare()
play()
}
}
override fun onDestroy() {
player.release()
super.onDestroy()
}
companion object {
const val EXTRA_URI = "uri"
private fun createRenderersFactory(context: Context): RenderersFactory {
return RenderersFactory { eventHandler, videoRendererEventListener, audioRendererEventListener, _, _ ->
arrayOf(
MediaCodecAudioRenderer(context, MediaCodecSelector.DEFAULT, eventHandler, audioRendererEventListener),
MediaCodecVideoRenderer(context, MediaCodecSelector.DEFAULT,
DefaultRenderersFactory.DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS, eventHandler,
videoRendererEventListener, 50)
)
}
}
private fun createDataSourceFactory(): DataSource.Factory {
return OkHttpDataSourceFactory(HttpUtils.deferringCallFactory) // Provide support for HTTP data sources only
}
private fun createExtractorsFactory(): ExtractorsFactory {
return ExtractorsFactory { arrayOf(Mp4Extractor(), OggExtractor(), MatroskaExtractor()) }
}
private fun createMediaSourceFactory(dataSourceFactory: DataSource.Factory, extractorsFactory: ExtractorsFactory): MediaSourceFactory {
return DrmFreeProgressiveMediaSourceFactory(dataSourceFactory, extractorsFactory)
}
fun createSimpleExoPlayer(context: Context): SimpleExoPlayer {
return SimpleExoPlayer.Builder(context,
createRenderersFactory(context),
DefaultTrackSelector(context),
createMediaSourceFactory(createDataSourceFactory(), createExtractorsFactory()),
DefaultLoadControl(),
DefaultBandwidthMeter.getSingletonInstance(context),
AnalyticsCollector(Clock.DEFAULT)
).build()
}
}
}

View file

@ -30,6 +30,7 @@ import androidx.fragment.app.commit
import androidx.fragment.app.viewModels
import be.digitalia.fosdem.R
import be.digitalia.fosdem.activities.PersonInfoActivity
import be.digitalia.fosdem.activities.VideoPlayerActivity
import be.digitalia.fosdem.api.FosdemApi
import be.digitalia.fosdem.model.Building
import be.digitalia.fosdem.model.Event
@ -294,8 +295,15 @@ class EventDetailsFragment : Fragment(R.layout.fragment_event_details) {
private class LinkClickListener(private val event: Event, private val link: Link) : View.OnClickListener {
override fun onClick(v: View) {
val context = v.context
if (link.url.endsWith(".mp4") || link.url.endsWith(".webm")) {
val intent = Intent(context, VideoPlayerActivity::class.java)
.putExtra(VideoPlayerActivity.EXTRA_URI, link.url)
context.startActivity(intent)
return
}
try {
val context = v.context
CustomTabsIntent.Builder()
.configureToolbarColors(context, event.track.type.appBarColorResId)
.setShowTitle(true)

View file

@ -5,6 +5,7 @@ import be.digitalia.fosdem.utils.BackgroundWorkScope
import kotlinx.coroutines.CoroutineStart
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.suspendCancellableCoroutine
import okhttp3.Call
import okhttp3.Callback
@ -36,6 +37,10 @@ object HttpUtils {
.build()
}
val deferringCallFactory = Call.Factory { request ->
runBlocking { deferredClient.await() }.newCall(request)
}
suspend fun <T> get(url: String, bodyParser: (body: ResponseBody, rawResponse: okhttp3.Response) -> T): Response.Success<T> {
return when (val response = get(url, null, bodyParser)) {
// Can only receive NotModified if lastModified argument is non-null

View file

@ -0,0 +1,39 @@
package com.google.android.exoplayer2.source
import com.google.android.exoplayer2.C
import com.google.android.exoplayer2.MediaItem
import com.google.android.exoplayer2.drm.DrmSessionManager
import com.google.android.exoplayer2.extractor.ExtractorsFactory
import com.google.android.exoplayer2.upstream.DataSource
import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy
import com.google.android.exoplayer2.upstream.HttpDataSource
import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy
class DrmFreeProgressiveMediaSourceFactory(private val dataSourceFactory: DataSource.Factory,
private val extractorsFactory: ExtractorsFactory) : MediaSourceFactory {
private var loadErrorHandlingPolicy: LoadErrorHandlingPolicy = DefaultLoadErrorHandlingPolicy()
var continueLoadingCheckIntervalBytes: Int = ProgressiveMediaSource.DEFAULT_LOADING_CHECK_INTERVAL_BYTES
override fun setDrmSessionManager(drmSessionManager: DrmSessionManager?) = this
override fun setDrmHttpDataSourceFactory(drmHttpDataSourceFactory: HttpDataSource.Factory?) = this
override fun setDrmUserAgent(userAgent: String?) = this
override fun setLoadErrorHandlingPolicy(loadErrorHandlingPolicy: LoadErrorHandlingPolicy?): DrmFreeProgressiveMediaSourceFactory {
this.loadErrorHandlingPolicy = loadErrorHandlingPolicy ?: DefaultLoadErrorHandlingPolicy()
return this
}
override fun getSupportedTypes() = intArrayOf(C.TYPE_OTHER)
override fun createMediaSource(mediaItem: MediaItem): MediaSource {
return ProgressiveMediaSource(
mediaItem,
dataSourceFactory,
extractorsFactory,
DrmSessionManager.DUMMY,
loadErrorHandlingPolicy,
continueLoadingCheckIntervalBytes)
}
}

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.exoplayer2.ui.PlayerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />