diff --git a/demos/effect/build.gradle b/demos/effect/build.gradle
index 7d7ec62d33..beca6c5686 100644
--- a/demos/effect/build.gradle
+++ b/demos/effect/build.gradle
@@ -69,11 +69,13 @@ dependencies {
def composeBom = platform('androidx.compose:compose-bom:2024.10.00')
implementation composeBom
- implementation 'androidx.activity:activity-compose:1.9.3'
- implementation 'androidx.compose.foundation:foundation-android:1.7.4'
- implementation 'androidx.compose.material3:material3-android:1.3.0'
+ implementation 'androidx.activity:activity-compose'
+ implementation 'androidx.compose.foundation:foundation'
+ implementation 'androidx.compose.material3:material3'
implementation 'com.google.android.material:material:' + androidxMaterialVersion
+ implementation project(modulePrefix + 'lib-ui')
+
// For detecting and debugging leaks only. LeakCanary is not needed for demo app to work.
debugImplementation 'com.squareup.leakcanary:leakcanary-android:' + leakCanaryVersion
}
diff --git a/demos/effect/src/main/java/androidx/media3/demo/effect/EffectActivity.kt b/demos/effect/src/main/java/androidx/media3/demo/effect/EffectActivity.kt
index bb6de7a07c..3b991ca60e 100644
--- a/demos/effect/src/main/java/androidx/media3/demo/effect/EffectActivity.kt
+++ b/demos/effect/src/main/java/androidx/media3/demo/effect/EffectActivity.kt
@@ -20,28 +20,96 @@ import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.material3.Surface
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.Button
+import androidx.compose.material3.Scaffold
+import androidx.compose.material3.SnackbarHost
+import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
-import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.dimensionResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.viewinterop.AndroidView
+import androidx.media3.ui.PlayerView
+import kotlinx.coroutines.launch
class EffectActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContent {
- Surface(modifier = Modifier.fillMaxSize()) {
- Column(
- modifier = Modifier.fillMaxWidth(),
- verticalArrangement = Arrangement.Center,
- horizontalAlignment = Alignment.CenterHorizontally,
- ) {
- Text(text = "Effect demo", textAlign = TextAlign.Center)
- }
+ setContent { EffectDemo() }
+ }
+
+ @Composable
+ fun EffectDemo() {
+ val snackbarHostState = remember { SnackbarHostState() }
+ val coroutineScope = rememberCoroutineScope()
+
+ Scaffold(
+ modifier = Modifier.fillMaxSize(),
+ snackbarHost = { SnackbarHost(hostState = snackbarHostState) },
+ ) { paddingValues ->
+ Column(
+ modifier = Modifier.fillMaxWidth().padding(paddingValues),
+ verticalArrangement = Arrangement.Top,
+ horizontalAlignment = Alignment.CenterHorizontally,
+ ) {
+ InputChooser(
+ onButtonClick = {
+ coroutineScope.launch {
+ snackbarHostState.showSnackbar(message = "Button is not yet implemented.")
+ }
+ }
+ )
+ PlayerScreen()
+ Effects(
+ onButtonClick = {
+ coroutineScope.launch {
+ snackbarHostState.showSnackbar(message = "Button is not yet implemented.")
+ }
+ }
+ )
}
}
}
+
+ @Composable
+ fun InputChooser(onButtonClick: () -> Unit) {
+ Row(
+ modifier = Modifier.padding(vertical = dimensionResource(id = R.dimen.small_padding)),
+ horizontalArrangement = Arrangement.spacedBy(dimensionResource(id = R.dimen.small_padding)),
+ ) {
+ Button(onClick = onButtonClick) {
+ Text(text = stringResource(id = R.string.choose_preset_input))
+ }
+ Button(onClick = onButtonClick) {
+ Text(text = stringResource(id = R.string.choose_local_file))
+ }
+ }
+ }
+
+ @Composable
+ fun PlayerScreen() {
+ val context = LocalContext.current
+ AndroidView(
+ factory = { PlayerView(context).apply {} },
+ modifier =
+ Modifier.height(dimensionResource(id = R.dimen.android_view_height))
+ .padding(all = dimensionResource(id = R.dimen.small_padding)),
+ )
+ }
+
+ @Composable
+ fun Effects(onButtonClick: () -> Unit) {
+ Button(onClick = onButtonClick) { Text(text = stringResource(id = R.string.apply_effects)) }
+ }
}
diff --git a/demos/effect/src/main/res/values/dimens.xml b/demos/effect/src/main/res/values/dimens.xml
new file mode 100644
index 0000000000..8a7116ae41
--- /dev/null
+++ b/demos/effect/src/main/res/values/dimens.xml
@@ -0,0 +1,19 @@
+
+
+
+ 8dp
+ 256dp
+
diff --git a/demos/effect/src/main/res/values/strings.xml b/demos/effect/src/main/res/values/strings.xml
index d650835c4c..25c8596b99 100644
--- a/demos/effect/src/main/res/values/strings.xml
+++ b/demos/effect/src/main/res/values/strings.xml
@@ -15,4 +15,8 @@
-->
Effect Demo
+ Choose preset input
+ Choose local file
+ Apply effects
+ OK