diff --git a/README.md b/README.md
index d3e7b341..0904f0a0 100644
--- a/README.md
+++ b/README.md
@@ -56,6 +56,7 @@ Note that in order to enable the FreeWheel sample apps, you must independently o
### Brightcove Kotlin sample apps using ExoPlayer
* [Audio Only Sample App](https://github.com/KEAMCRF/android-player-samples/tree/AudioOnlySample/brightcove-exoplayer-kotlin/AudioOnlySampleApp): This app shows how to setup the Brightcove ExoPlayer with audio-only assets.
+* [Kotlin Compose Activity Sample App](https://github.com/fllaryora/android-player-samples/tree/master/brightcove-exoplayer-kotlin/KotlinComposeSampleApp): This app shows how to setup the Brightcove ExoPlayer with audio-only assets.
## Installing the sample apps
Currently, all of the sample app projects must be installed together as a bundle. Individual sample app projects also have specific dependencies. For those specific dependencies, see the individual project descriptions above for details.
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/.gitignore b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/.gitignore
new file mode 100644
index 00000000..42afabfd
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/build.gradle b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/build.gradle
new file mode 100644
index 00000000..ab9fc4ea
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/build.gradle
@@ -0,0 +1,66 @@
+plugins {
+ id 'com.android.application'
+ id 'org.jetbrains.kotlin.android'
+}
+
+android {
+ namespace 'com.brightcove.player.samples.compose.activity'
+ compileSdk ANDROID_COMPILE_COMPOSE_SDK_VERSION
+
+ defaultConfig {
+ applicationId "com.brightcove.player.samples.compose.activity"
+ minSdk ANDROID_COMPOSE_MIN_SDK_VERSION
+ targetSdk ANDROID_TARGET_COMPOSE_SDK_VERSION
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ vectorDrawables {
+ useSupportLibrary true
+ }
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_11
+ targetCompatibility JavaVersion.VERSION_11
+ }
+ kotlinOptions {
+ jvmTarget = JavaVersion.VERSION_11.toString()
+ }
+ buildFeatures {
+ compose true
+ }
+ composeOptions {
+ kotlinCompilerExtensionVersion '1.3.2'
+ }
+ packagingOptions {
+ resources {
+ excludes += '/META-INF/{AL2.0,LGPL2.1}'
+ }
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
+ implementation 'androidx.activity:activity-compose:1.5.1'
+ implementation platform('androidx.compose:compose-bom:2022.10.00')
+ implementation 'androidx.compose.ui:ui'
+ implementation 'androidx.compose.ui:ui-graphics'
+ implementation 'androidx.compose.ui:ui-tooling-preview'
+ implementation 'androidx.compose.material3:material3'
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+ androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00')
+ androidTestImplementation 'androidx.compose.ui:ui-test-junit4'
+ debugImplementation 'androidx.compose.ui:ui-tooling'
+ debugImplementation 'androidx.compose.ui:ui-test-manifest'
+}
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/proguard-rules.pro b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/proguard-rules.pro
new file mode 100644
index 00000000..481bb434
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/androidTest/java/com/brightcove/player/samples/compose/activity/ExampleInstrumentedTest.kt b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/androidTest/java/com/brightcove/player/samples/compose/activity/ExampleInstrumentedTest.kt
new file mode 100644
index 00000000..2eb73d9f
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/androidTest/java/com/brightcove/player/samples/compose/activity/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.brightcove.player.samples.compose.activity
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.brightcove.player.samples.compose.activity", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/AndroidManifest.xml b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..0132244a
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/AndroidManifest.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/java/com/brightcove/player/samples/compose/activity/MainActivity.kt b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/java/com/brightcove/player/samples/compose/activity/MainActivity.kt
new file mode 100644
index 00000000..1877c0cf
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/java/com/brightcove/player/samples/compose/activity/MainActivity.kt
@@ -0,0 +1,152 @@
+package com.brightcove.player.samples.compose.activity
+
+import android.os.Bundle
+import android.view.ViewGroup.LayoutParams
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.compose.foundation.layout.aspectRatio
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalLifecycleOwner
+import androidx.compose.ui.viewinterop.AndroidView
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.Lifecycle.Event.ON_ANY
+import androidx.lifecycle.Lifecycle.Event.ON_CREATE
+import androidx.lifecycle.Lifecycle.Event.ON_DESTROY
+import androidx.lifecycle.Lifecycle.Event.ON_PAUSE
+import androidx.lifecycle.Lifecycle.Event.ON_RESUME
+import androidx.lifecycle.Lifecycle.Event.ON_START
+import androidx.lifecycle.Lifecycle.Event.ON_STOP
+import androidx.lifecycle.LifecycleEventObserver
+import com.brightcove.player.event.EventEmitterImpl
+import com.brightcove.player.event.EventLogger
+import com.brightcove.player.model.DeliveryType.MP4
+import com.brightcove.player.model.Video
+import com.brightcove.player.playback.PlaybackNotification
+import com.brightcove.player.samples.compose.activity.ui.theme.AndroidplayersamplesTheme
+import com.brightcove.player.util.LifecycleUtil
+import com.brightcove.player.view.BaseVideoView
+import com.brightcove.player.view.BrightcoveExoPlayerVideoView
+
+class MainActivity : ComponentActivity(), PlaybackNotification.OnRestorePlaybackHandler {
+
+ val TAG: String = MainActivity::class.java.simpleName
+ lateinit var baseVideoView: BaseVideoView
+ //lateinit var eventLogger: EventLogger
+ lateinit var lifecycleUtil: LifecycleUtil
+ //private var savedInstanceState: Bundle? = null
+
+ fun showClosedCaptioningDialog() {
+ baseVideoView.closedCaptioningController?.showCaptionsDialog()
+ }
+
+ fun enterFullScreen() {
+ baseVideoView.eventEmitter?.emit("enterFullScreen")
+ }
+
+ fun exitFullScreen() {
+ baseVideoView.eventEmitter?.emit("exitFullScreen")
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setContent {
+ AndroidplayersamplesTheme {
+
+ var lifecycle by remember {
+ mutableStateOf(Lifecycle.Event.ON_CREATE)
+ }
+
+ val lifecycleOwner = LocalLifecycleOwner.current
+ DisposableEffect(lifecycleOwner) {
+ val observer = LifecycleEventObserver { _, event ->
+ lifecycle = event
+ }
+ lifecycleOwner.lifecycle.addObserver(observer)
+
+ onDispose {
+ lifecycleOwner.lifecycle.removeObserver(observer)
+ }
+ }
+ // A surface container using the 'background' color from the theme
+ Surface(
+ modifier = Modifier.fillMaxSize(),
+ color = MaterialTheme.colorScheme.background
+ ) {
+ AndroidView(
+ modifier = Modifier
+ .fillMaxWidth()
+ .aspectRatio(16 / 9f),
+ // The viewBlock provides us with the Context so we do not have to pass this down into the @Composable
+ // ourself
+ factory = { context ->
+ val baseVideoView = BrightcoveExoPlayerVideoView(context).apply {
+ layoutParams = LayoutParams(
+ LayoutParams.MATCH_PARENT,
+ LayoutParams.MATCH_PARENT,
+ )
+ }
+ baseVideoView.eventEmitter = EventEmitterImpl()
+ //*****
+ lifecycleUtil = LifecycleUtil(baseVideoView)
+ lifecycleUtil.onCreate(savedInstanceState, this)
+ //eventLogger =
+ // EventLogger(this.baseVideoView.eventEmitter,
+ // true, this.javaClass.simpleName)
+ ///*****
+ val video =
+ Video.createVideo("https://media.w3.org/2010/05/sintel/trailer.mp4", MP4)
+ baseVideoView.apply {
+ add(video)
+ analytics.account = "1760897681001"
+ start()
+ }
+ baseVideoView
+ },
+ update = {
+ when (lifecycle) {
+ ON_PAUSE -> {
+ lifecycleUtil.activityOnPause()
+ }
+ ON_RESUME -> {
+ lifecycleUtil.activityOnResume()
+ }
+ ON_CREATE -> {
+ //nothing
+ }
+ ON_START -> {
+ lifecycleUtil.activityOnStart()
+ }
+ ON_STOP -> {
+ lifecycleUtil.activityOnStop()
+ }
+ ON_DESTROY -> {
+ lifecycleUtil.onActivityDestroyed(this)
+ }
+ ON_ANY -> {
+ //nothing
+ }
+ }
+ },
+ )
+ }
+ }
+ }
+ }
+
+ override fun onSaveInstanceState(bundle: Bundle) {
+ baseVideoView.eventEmitter.on(
+ "activitySaveInstanceState"
+ ) { super.onSaveInstanceState(bundle) }
+ lifecycleUtil.activityOnSaveInstanceState(bundle)
+ }
+}
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/java/com/brightcove/player/samples/compose/activity/ui/theme/Color.kt b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/java/com/brightcove/player/samples/compose/activity/ui/theme/Color.kt
new file mode 100644
index 00000000..4f89994c
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/java/com/brightcove/player/samples/compose/activity/ui/theme/Color.kt
@@ -0,0 +1,11 @@
+package com.brightcove.player.samples.compose.activity.ui.theme
+
+import androidx.compose.ui.graphics.Color
+
+val Purple80 = Color(0xFFD0BCFF)
+val PurpleGrey80 = Color(0xFFCCC2DC)
+val Pink80 = Color(0xFFEFB8C8)
+
+val Purple40 = Color(0xFF6650a4)
+val PurpleGrey40 = Color(0xFF625b71)
+val Pink40 = Color(0xFF7D5260)
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/java/com/brightcove/player/samples/compose/activity/ui/theme/Theme.kt b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/java/com/brightcove/player/samples/compose/activity/ui/theme/Theme.kt
new file mode 100644
index 00000000..d714e2ec
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/java/com/brightcove/player/samples/compose/activity/ui/theme/Theme.kt
@@ -0,0 +1,70 @@
+package com.brightcove.player.samples.compose.activity.ui.theme
+
+import android.app.Activity
+import android.os.Build
+import androidx.compose.foundation.isSystemInDarkTheme
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.dynamicDarkColorScheme
+import androidx.compose.material3.dynamicLightColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.SideEffect
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalView
+import androidx.core.view.WindowCompat
+
+private val DarkColorScheme = darkColorScheme(
+ primary = Purple80,
+ secondary = PurpleGrey80,
+ tertiary = Pink80
+)
+
+private val LightColorScheme = lightColorScheme(
+ primary = Purple40,
+ secondary = PurpleGrey40,
+ tertiary = Pink40
+
+ /* Other default colors to override
+ background = Color(0xFFFFFBFE),
+ surface = Color(0xFFFFFBFE),
+ onPrimary = Color.White,
+ onSecondary = Color.White,
+ onTertiary = Color.White,
+ onBackground = Color(0xFF1C1B1F),
+ onSurface = Color(0xFF1C1B1F),
+ */
+)
+
+@Composable
+fun AndroidplayersamplesTheme(
+ darkTheme: Boolean = isSystemInDarkTheme(),
+ // Dynamic color is available on Android 12+
+ dynamicColor: Boolean = true,
+ content: @Composable () -> Unit
+) {
+ val colorScheme = when {
+ dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
+ val context = LocalContext.current
+ if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
+ }
+
+ darkTheme -> DarkColorScheme
+ else -> LightColorScheme
+ }
+ val view = LocalView.current
+ if (!view.isInEditMode) {
+ SideEffect {
+ val window = (view.context as Activity).window
+ window.statusBarColor = colorScheme.primary.toArgb()
+ WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
+ }
+ }
+
+ MaterialTheme(
+ colorScheme = colorScheme,
+ typography = Typography,
+ content = content
+ )
+}
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/java/com/brightcove/player/samples/compose/activity/ui/theme/Type.kt b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/java/com/brightcove/player/samples/compose/activity/ui/theme/Type.kt
new file mode 100644
index 00000000..67582dcd
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/java/com/brightcove/player/samples/compose/activity/ui/theme/Type.kt
@@ -0,0 +1,34 @@
+package com.brightcove.player.samples.compose.activity.ui.theme
+
+import androidx.compose.material3.Typography
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.sp
+
+// Set of Material typography styles to start with
+val Typography = Typography(
+ bodyLarge = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.Normal,
+ fontSize = 16.sp,
+ lineHeight = 24.sp,
+ letterSpacing = 0.5.sp
+ )
+ /* Other default text styles to override
+ titleLarge = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.Normal,
+ fontSize = 22.sp,
+ lineHeight = 28.sp,
+ letterSpacing = 0.sp
+ ),
+ labelSmall = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.Medium,
+ fontSize = 11.sp,
+ lineHeight = 16.sp,
+ letterSpacing = 0.5.sp
+ )
+ */
+)
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/drawable-v24/ic_launcher_foreground.xml b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 00000000..2b068d11
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/drawable/ic_launcher_background.xml b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 00000000..07d5da9c
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 00000000..036d09bc
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 00000000..036d09bc
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/ic_launcher.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000..0201441b
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..88371390
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/ic_launcher_round.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 00000000..1c8bf84c
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-anydpi-v26/ic_launcher.xml b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 00000000..036d09bc
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-anydpi-v26/ic_launcher_round.xml b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 00000000..036d09bc
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-hdpi/ic_launcher.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000..0201441b
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-hdpi/ic_launcher.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-hdpi/ic_launcher_foreground.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..88371390
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-hdpi/ic_launcher_round.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 00000000..1c8bf84c
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-mdpi/ic_launcher.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000..26721fd4
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-mdpi/ic_launcher.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-mdpi/ic_launcher_foreground.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..6244da88
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-mdpi/ic_launcher_round.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 00000000..ed5cb6e4
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xhdpi/ic_launcher.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000..e6c33269
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xhdpi/ic_launcher.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xhdpi/ic_launcher_foreground.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..3e0dbeaa
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xhdpi/ic_launcher_round.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..7e759e36
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxhdpi/ic_launcher.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000..0d412f56
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxhdpi/ic_launcher_foreground.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..d9d35705
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxhdpi/ic_launcher_round.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..cbab8ab9
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxxhdpi/ic_launcher.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000..4fdd094d
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxxhdpi/ic_launcher_foreground.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..3819f5a4
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxxhdpi/ic_launcher_round.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..7a534d0f
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-hdpi/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-mdpi/ic_launcher.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000..26721fd4
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..6244da88
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-mdpi/ic_launcher_round.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 00000000..ed5cb6e4
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xhdpi/ic_launcher.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000..e6c33269
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..3e0dbeaa
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..7e759e36
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxhdpi/ic_launcher.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000..0d412f56
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..d9d35705
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..cbab8ab9
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000..4fdd094d
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 00000000..3819f5a4
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..7a534d0f
Binary files /dev/null and b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/values/colors.xml b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/values/colors.xml
new file mode 100644
index 00000000..10735d02
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/values/colors.xml
@@ -0,0 +1,13 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #03028d
+ #06eae5
+ #06EAE4
+
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/values/strings.xml b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/values/strings.xml
new file mode 100644
index 00000000..fc4c057a
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ KotlinComposeSampleApp
+
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/values/themes.xml b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/values/themes.xml
new file mode 100644
index 00000000..8a6b0bd6
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/main/res/values/themes.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/test/java/com/brightcove/player/samples/compose/activity/ExampleUnitTest.kt b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/test/java/com/brightcove/player/samples/compose/activity/ExampleUnitTest.kt
new file mode 100644
index 00000000..44846b55
--- /dev/null
+++ b/brightcove-exoplayer-kotlin/KotlinComposeSampleApp/src/test/java/com/brightcove/player/samples/compose/activity/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.brightcove.player.samples.compose.activity
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index f6e14c45..d574f1be 100644
--- a/build.gradle
+++ b/build.gradle
@@ -184,6 +184,15 @@ configure(subprojects.findAll {it.name.endsWith('SampleApp')}) {
}
}
+ if (project.name.contains('KotlinComposeSampleApp')) {
+ dependencies {
+ implementation "com.brightcove.player:android-sdk:${anpVersion}"
+ implementation "com.brightcove.player:exoplayer2:${anpVersion}"
+ //implementation "androidx.media3:media3-exoplayer:1.0.1"
+ //implamentation "androidx.media3:media3-ui:1.0.1"
+ }
+ }
+
println "Processing ${project.name}"
}
diff --git a/constants.gradle b/constants.gradle
index b9b1c6c8..84218b14 100644
--- a/constants.gradle
+++ b/constants.gradle
@@ -1,7 +1,10 @@
project.ext {
ANDROID_MIN_SDK_VERSION = 19
+ ANDROID_COMPOSE_MIN_SDK_VERSION = 24
ANDROID_TARGET_SDK_VERSION = 31
ANDROID_COMPILE_SDK_VERSION = 31
+ ANDROID_COMPILE_COMPOSE_SDK_VERSION = 33
+ ANDROID_TARGET_COMPOSE_SDK_VERSION = 33
ANDROID_BUILD_TOOLS_VERSION = '30.0.3'
ANDROIDX_APPCOMPAT = '1.4.0'
diff --git a/settings.gradle b/settings.gradle
index 8ffb004e..4b59f496 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -20,6 +20,7 @@ include ':brightcove-exoplayer:ThumbnailScrubberSampleApp'
include ':brightcove-exoplayer:AudioOnlySampleApp'
include ':brightcove-exoplayer-kotlin:AudioOnlySampleApp'
+include ':brightcove-exoplayer-kotlin:KotlinComposeSampleApp'
// For building Brightcove Player Controls specific sample apps, which are located under the 'brightcove-player-controls' directory.
include ':brightcove-player-controls:CustomizedControlsSampleApp'