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:
parent
4e8959ce84
commit
44f75b205e
7 changed files with 159 additions and 1 deletions
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
5
app/src/main/res/layout/player.xml
Normal file
5
app/src/main/res/layout/player.xml
Normal 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" />
|
Loading…
Reference in a new issue