Skip to content

Commit

Permalink
feat: Add TopAppBar components and update button interactions
Browse files Browse the repository at this point in the history
- Introduced `LargeTopAppBarWithScaffold` and `TopAppBarScaffold` for creating top app bars with scaffold layouts.
- Added a `nestedScroll` modifier to the scaffolds to enable scrolling behavior.
- Updated `AnimatedButtonDirection`, `FloatingActionButton`, and `SmallFloatingActionButton` to play a click sound effect when pressed.
- Bumping the library version to 0.0.64.
  • Loading branch information
Mihai-Cristian Condrea committed Feb 19, 2025
1 parent b8a4de5 commit 8603cf9
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 7 deletions.
2 changes: 1 addition & 1 deletion apptoolkit/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ publishing {
register<MavenPublication>("release") {
groupId = "com.github.D4rK7355608"
artifactId = "AppToolkit"
version = "0.0.63"
version = "0.0.64"

afterEvaluate {
from(components["release"])
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.d4rk.android.libs.apptoolkit.ui.components.buttons

import android.view.SoundEffectConstants
import android.view.View
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
Expand All @@ -10,10 +12,12 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalView
import com.d4rk.android.libs.apptoolkit.ui.components.modifiers.bounceClick

@Composable
Expand All @@ -27,7 +31,8 @@ fun AnimatedButtonDirection(
autoAnimate: Boolean = true ,
fromRight: Boolean = false
) {
val animatedVisibility = remember { mutableStateOf(false) }
val animatedVisibility : MutableState<Boolean> = remember { mutableStateOf(value = false) }
val view : View = LocalView.current

LaunchedEffect(visible) {
if (autoAnimate && visible) {
Expand All @@ -46,7 +51,10 @@ fun AnimatedButtonDirection(
) {
IconButton(
modifier = modifier.bounceClick(),
onClick = onClick
onClick = {
view.playSoundEffect(SoundEffectConstants.CLICK)
onClick()
}
) {
Icon(imageVector = icon, contentDescription = contentDescription)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.d4rk.android.libs.apptoolkit.ui.components.buttons

import android.view.SoundEffectConstants
import android.view.View
import androidx.compose.animation.core.FastOutSlowInEasing
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.tween
Expand All @@ -9,6 +11,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.TransformOrigin
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.platform.LocalView
import com.d4rk.android.libs.apptoolkit.ui.components.modifiers.bounceClick

/**
Expand Down Expand Up @@ -40,9 +43,14 @@ fun AnimatedExtendedFloatingActionButton(
label = "FAB Scale"
)

val view : View = LocalView.current

if (animatedScale > 0f) {
ExtendedFloatingActionButton(
onClick = onClick,
onClick = {
view.playSoundEffect(SoundEffectConstants.CLICK)
onClick()
},
icon = icon,
text = text ?: {},
expanded = expanded,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.d4rk.android.libs.apptoolkit.ui.components.buttons

import android.view.SoundEffectConstants
import android.view.View
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.scaleIn
import androidx.compose.animation.scaleOut
Expand All @@ -8,17 +10,22 @@ import androidx.compose.material3.SmallFloatingActionButton
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalView
import com.d4rk.android.libs.apptoolkit.ui.components.modifiers.bounceClick

@Composable
fun SmallFloatingActionButton(modifier : Modifier = Modifier, isVisible : Boolean , isExtended : Boolean , icon : ImageVector , contentDescription : String? = null , onClick : () -> Unit) {
fun SmallFloatingActionButton(modifier : Modifier = Modifier , isVisible : Boolean , isExtended : Boolean , icon : ImageVector , contentDescription : String? = null , onClick : () -> Unit) {
val view : View = LocalView.current

AnimatedVisibility(
visible = isVisible && isExtended ,
enter = scaleIn() ,
exit = scaleOut() ,
) {
SmallFloatingActionButton(onClick = onClick , modifier = modifier
.bounceClick()) {
SmallFloatingActionButton(onClick = {
view.playSoundEffect(SoundEffectConstants.CLICK)
onClick()
} , modifier = modifier.bounceClick()) {
Icon(imageVector = icon , contentDescription = contentDescription)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.d4rk.android.libs.apptoolkit.ui.components.navigation

import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.RowScope
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LargeTopAppBar
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.res.stringResource
import com.d4rk.android.libs.apptoolkit.ui.components.buttons.AnimatedButtonDirection

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun LargeTopAppBarWithScaffold(title: String, onBackClicked: () -> Unit, actions: @Composable (RowScope.() -> Unit) = {}, floatingActionButton: @Composable (() -> Unit)? = null, content: @Composable (PaddingValues) -> Unit) {
val scrollBehaviorState: TopAppBarScrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(state = rememberTopAppBarState())

Scaffold(
modifier = Modifier.nestedScroll(connection = scrollBehaviorState.nestedScrollConnection) ,
topBar = {
LargeTopAppBar(
title = { Text(text = title) },
navigationIcon = {
AnimatedButtonDirection(
icon = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = stringResource(id = com.d4rk.android.libs.apptoolkit.R.string.go_back),
onClick = { onBackClicked() }
)
},
actions = actions,
scrollBehavior = scrollBehaviorState
)
} ,
floatingActionButton = floatingActionButton ?: {} ,
) { paddingValues ->
content(paddingValues)
}
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TopAppBarScaffold(title : String , content : @Composable (PaddingValues) -> Unit) {
val scrollBehaviorState : TopAppBarScrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(state = rememberTopAppBarState())

Scaffold(modifier = Modifier.nestedScroll(connection = scrollBehaviorState.nestedScrollConnection) , topBar = {
LargeTopAppBar(title = { Text(text = title) } , scrollBehavior = scrollBehaviorState)
}) { paddingValues ->
content(paddingValues)
}
}

0 comments on commit 8603cf9

Please sign in to comment.