From 7b9cfd196497340f1e8af963727967705e254002 Mon Sep 17 00:00:00 2001 From: shahddaghash Date: Wed, 6 Nov 2024 09:15:44 -0800 Subject: [PATCH] Add basic UI to effect demo app Added a basic UI to the effect demo app, including a PlayerView, buttons to choose preset input and choose local file, and a button to apply effects. The buttons are currently not implemented, and the app will show a snackbar message when they are clicked. PiperOrigin-RevId: 693751272 --- demos/effect/build.gradle | 8 +- .../media3/demo/effect/EffectActivity.kt | 90 ++++++++++++++++--- demos/effect/src/main/res/values/dimens.xml | 19 ++++ demos/effect/src/main/res/values/strings.xml | 4 + 4 files changed, 107 insertions(+), 14 deletions(-) create mode 100644 demos/effect/src/main/res/values/dimens.xml 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