Skip to content

Commit

Permalink
Merge pull request #11 from LDRAlighieri/release/0.4.0
Browse files Browse the repository at this point in the history
Release 0.4.0
  • Loading branch information
LDRAlighieri authored Feb 3, 2024
2 parents dce8a99 + 5fac333 commit f85f2d1
Show file tree
Hide file tree
Showing 15 changed files with 95 additions and 58 deletions.
16 changes: 15 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,20 @@
# ChangeLog


## Version 0.4.0

* New: Carbon(`composites-carbon`) module:
- KSP `Route` objects generation that help with navigation based on the Navigation Component
- Default arguments support (without reflection)
- Enums support
* Update: Fiberglass(`composites-fiberglass`) module:
- Add position index to item slot
- Add key and contentType factories
* Update: Kotlin to v1.9.22.
* Update: Compose BOM to v2024.01.00.
* Update: Minor update of other libraries.


## Version 0.3.1

* Update: Kotlin to v1.9.21.
Expand All @@ -21,7 +35,7 @@

## Version 0.2.0

* New: Fiberglass(`composites-fiberglass`) module:
* Update: Fiberglass(`composites-fiberglass`) module:
- Fiberglass flow column Composite
- Fiberglass flow row Composite
- Fiberglass lazy horizontal grid Composite
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Please consider giving this repository a star ⭐ if you like the project.


## Modules
* [composites-carbon] — Annotation processor for generating Route objects that help with navigation based on the Navigation Component
* [composites-carbon] — Lightweight annotation processor for generating Route objects that help with navigation based on the Navigation Component
* [composites-fiberglass] — A tool for building complex screens based on simple blocks.


Expand All @@ -40,7 +40,7 @@ Add one or more dependencies:

```kotlin
dependencies {
implementation("ru.ldralighieri.composites:composites-fiberglass:0.3.1")
implementation("ru.ldralighieri.composites:composites-fiberglass:0.4.0")
}
```

Expand Down
16 changes: 9 additions & 7 deletions composites-carbon/README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

# Carbon (work in progress 🚧🔧️👷⛏🚧)
# Carbon

Annotation processor ([Kotlin Symbol Processing, KSP][ksp]) for generating Route objects that help with navigation based on the [Navigation Component][navigation].
Lightweight annotation processor ([Kotlin Symbol Processing, KSP][ksp]) for generating Route objects that help with navigation based on the [Navigation Component][navigation].
Allows you to significantly reduce routine and time spent on creating `Route` objects manually.


Expand All @@ -12,9 +12,11 @@ Allows you to significantly reduce routine and time spent on creating `Route` ob

## Roadmap

- [X] KSP `Route` object generation
- [X] Default arguments (without reflection)
- [X] KSP `Route` objects generation
- [X] Default arguments support (without reflection)
- [X] Enums support
- [ ] Generate `NavGraphBuilder.composable` extension
- [ ] Arrays support
- [ ] Parcelable and Serializable support (using parcelable and serializable is not best practice. It is recommended to use primitives)
- [ ] Optional. Default arguments (with reflection)

Expand All @@ -25,8 +27,8 @@ Add dependency:

```kotlin
dependencies {
implementation("ru.ldralighieri.composites:composites-carbon-core:0.4.0-SNAPSHOT")
ksp("ru.ldralighieri.composites:composites-carbon-processor:0.4.0-SNAPSHOT")
implementation("ru.ldralighieri.composites:composites-carbon-core:0.4.0")
ksp("ru.ldralighieri.composites:composites-carbon-processor:0.4.0")
}
```

Expand Down Expand Up @@ -85,8 +87,8 @@ public object CompositesFiberglassRoute {
```
The object contains the components necessary for navigation:
- `route`, `arguments` and `deeplink` are used for navigation
- `parseArguments` and `parseArguments` for parsing the argument class from `NavBackStackEntry` and `SavedStateHandle` respectively
- `create` creates a Destination class for [navigator]
- `parseArguments` and `parseArguments` for parsing the argument class from `NavBackStackEntry` and `SavedStateHandle` respectively

If the base object contains no arguments:
```kotlin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ private fun CarbonRouteData.createFunction(resolver: Resolver) = FunSpec
data.defaultValue != null ->
defaultValue(
format = "%L",
data.defaultValue?.castValue(resolver)
data.defaultValue.castValue(resolver)
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import ru.ldralighieri.composites.carbon.processor.model.PARSE_ARGUMENTS_ENTRY_P
import ru.ldralighieri.composites.carbon.processor.model.PARSE_ARGUMENTS_HANDLE_PARAMETER_NAME
import ru.ldralighieri.composites.carbon.processor.model.booleanNullableTypeName
import ru.ldralighieri.composites.carbon.processor.model.booleanTypeName
import ru.ldralighieri.composites.carbon.processor.model.buildClassName
import ru.ldralighieri.composites.carbon.processor.model.floatNullableTypeName
import ru.ldralighieri.composites.carbon.processor.model.floatTypeName
import ru.ldralighieri.composites.carbon.processor.model.intNullableTypeName
Expand Down Expand Up @@ -63,10 +64,21 @@ internal fun List<ArgumentData>.getOptionalCreateArguments(): String =

internal fun ArgumentData.toBackStackGetter(resolver: Resolver): CodeBlock = buildCodeBlock {
if (resolver.isEnumType(type)) {
val typeName = type.makeNotNullable().toTypeName()
add(
format = "enumValueOf<%T>(${PARSE_ARGUMENTS_ENTRY_PARAMETER_NAME}" +
".arguments?.getString(\"$name\") ?: \"\")",
type.makeNotNullable().toTypeName()
format = """
if (%T.VERSION.SDK_INT >= %T.VERSION_CODES.TIRAMISU) {
$PARSE_ARGUMENTS_ENTRY_PARAMETER_NAME
.arguments?.getSerializable("$name", %T::class.java)
?: ${toDefaultValueLiteral(resolver)}
} else {
@Suppress("DEPRECATION")
$PARSE_ARGUMENTS_ENTRY_PARAMETER_NAME
.arguments?.getSerializable("$name") ${if (isNullable) "as?" else "as"} %T
}
""".trimIndent(),
buildClassName, buildClassName,
typeName, typeName
)
} else {
add(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package ru.ldralighieri.composites.carbon.processor.model

import com.squareup.kotlinpoet.ClassName

internal val buildClassName = ClassName("android.os", "Build")
internal val namedNavArgumentClassName = ClassName("androidx.navigation", "NamedNavArgument")
internal val navDeepLinkClassName = ClassName("androidx.navigation", "NavDeepLink")
internal val navBackStackEntryClassName = ClassName("androidx.navigation", "NavBackStackEntry")
Expand Down
6 changes: 3 additions & 3 deletions composites-fiberglass/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
*/

plugins {
id("composites.library.compose")
id("composites.spotless")
id("composites.dokka")
alias(libs.plugins.composites.library.compose)
alias(libs.plugins.composites.spotless)
alias(libs.plugins.composites.dokka)
}

android {
Expand Down
3 changes: 1 addition & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# Gradle
# https://github.com/Kotlin/dokka/issues/1405
org.gradle.jvmargs=-XX:MaxMetaspaceSize=1g

# Increase timeout when pushing to Sonatype
Expand All @@ -8,7 +7,7 @@ systemProp.org.gradle.internal.http.socketTimeout=120000

# Maven
GROUP=ru.ldralighieri.composites
VERSION_NAME=0.4.0-SNAPSHOT
VERSION_NAME=0.4.0

POM_DESCRIPTION=Composites are a group of tools and handy libraries that make it easier to use Jetpack Compose.

Expand Down
4 changes: 4 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
binary-compatibility-validator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "bcv" }
gver = { id = "com.github.ben-manes.versions", version.ref = "gver" }

composites-library-compose = { id = "composites.library.compose", version = "unspecified" }
composites-spotless = { id = "composites.spotless", version = "unspecified" }
composites-dokka = { id = "composites.dokka", version = "unspecified" }


[libraries]
# Androidx
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
9 changes: 9 additions & 0 deletions sample/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,15 @@
android:scheme="composites"
android:path="/composites/fiberglass" />
</intent-filter>

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="composites"
android:path="/composites/fiberglass/example" />
</intent-filter>
</activity>

</application>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,22 +27,29 @@ import ru.ldralighieri.composites.sample.ui.fiberglass.FiberglassColumnScreen
import ru.ldralighieri.composites.sample.ui.fiberglass.FiberglassGridScreen
import ru.ldralighieri.composites.sample.ui.fiberglass.FiberglassRootScreen

enum class FiberglassType { Column, Grid }

@CarbonRoute(route = "composites")
data object CompositesArgs

/*
adb shell am start \
-a android.intent.action.VIEW \
-d "composites://composites/fiberglass/<title>" ru.ldralighieri.composites.sample
*/
@CarbonRoute(route = "composites/fiberglass", deeplinkSchema = "composites")
data class CompositesFiberglassArgs(
@DefaultValue("Fiberglass composites") val title: String,
)

@CarbonRoute(route = "composites/fiberglass/column")
data class CompositesFiberglassColumnArgs(
val title: String,
)

@CarbonRoute(route = "composites/fiberglass/grid")
data class CompositesFiberglassGridArgs(
val title: String,
/*
adb shell am start \
-a android.intent.action.VIEW \
-d "composites://composites/fiberglass/example/<Column|Grid>" ru.ldralighieri.composites.sample
*/
@CarbonRoute(route = "composites/fiberglass/example", deeplinkSchema = "composites")
data class CompositesFiberglassExampleArgs(
val type: FiberglassType,
)

@Composable
Expand Down Expand Up @@ -72,23 +79,16 @@ fun AppNavHost(
}

composable(
route = CompositesFiberglassColumnRoute.route,
arguments = CompositesFiberglassColumnRoute.arguments,
deepLinks = CompositesFiberglassColumnRoute.deepLinks,
) { navBackStackEntry ->
FiberglassColumnScreen(
args = CompositesFiberglassColumnRoute.parseArguments(navBackStackEntry),
)
}

composable(
route = CompositesFiberglassGridRoute.route,
arguments = CompositesFiberglassGridRoute.arguments,
deepLinks = CompositesFiberglassGridRoute.deepLinks,
route = CompositesFiberglassExampleRoute.route,
arguments = CompositesFiberglassExampleRoute.arguments,
deepLinks = CompositesFiberglassExampleRoute.deepLinks,
) { navBackStackEntry ->
FiberglassGridScreen(
args = CompositesFiberglassGridRoute.parseArguments(navBackStackEntry),
)
val args: CompositesFiberglassExampleArgs =
CompositesFiberglassExampleRoute.parseArguments(navBackStackEntry)
when (args.type) {
FiberglassType.Column -> FiberglassColumnScreen(args)
FiberglassType.Grid -> FiberglassGridScreen(args)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import androidx.compose.ui.unit.dp
import ru.ldralighieri.composites.fiberglass.column.FiberglassLazyColumn
import ru.ldralighieri.composites.fiberglass.model.FiberglassItem
import ru.ldralighieri.composites.fiberglass.model.FiberglassStickyHeaderItem
import ru.ldralighieri.composites.sample.navigation.CompositesFiberglassColumnArgs
import ru.ldralighieri.composites.sample.navigation.CompositesFiberglassExampleArgs
import ru.ldralighieri.composites.sample.navigation.LocalNavigator
import ru.ldralighieri.composites.sample.navigation.Navigator
import ru.ldralighieri.composites.sample.theme.AppTheme
Expand All @@ -57,13 +57,13 @@ import ru.ldralighieri.composites.sample.ui.fiberglass.items.tagsFlowRowSlot

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun FiberglassColumnScreen(args: CompositesFiberglassColumnArgs) {
fun FiberglassColumnScreen(args: CompositesFiberglassExampleArgs) {
val navigator: Navigator = LocalNavigator.current

Column(modifier = Modifier.fillMaxSize()) {
TopAppBar(
title = {
Text(text = args.title, style = AppTheme.typography.headlineSmall)
Text(text = "Fiberglass ${args.type}", style = AppTheme.typography.headlineSmall)
},
navigationIcon = {
IconButton(onClick = { navigator.navigateBack() }) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import ru.ldralighieri.composites.fiberglass.grid.vertical.FiberglassLazyVerticalGrid
import ru.ldralighieri.composites.fiberglass.model.FiberglassItem
import ru.ldralighieri.composites.sample.navigation.CompositesFiberglassGridArgs
import ru.ldralighieri.composites.sample.navigation.CompositesFiberglassExampleArgs
import ru.ldralighieri.composites.sample.navigation.LocalNavigator
import ru.ldralighieri.composites.sample.navigation.Navigator
import ru.ldralighieri.composites.sample.theme.AppTheme
Expand All @@ -51,13 +51,13 @@ import ru.ldralighieri.composites.sample.ui.fiberglass.items.primaryGridSlot

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun FiberglassGridScreen(args: CompositesFiberglassGridArgs) {
fun FiberglassGridScreen(args: CompositesFiberglassExampleArgs) {
val navigator: Navigator = LocalNavigator.current

Column(modifier = Modifier.fillMaxSize()) {
TopAppBar(
title = {
Text(text = args.title, style = AppTheme.typography.headlineSmall)
Text(text = "Fiberglass ${args.type}", style = AppTheme.typography.headlineSmall)
},
navigationIcon = {
IconButton(onClick = { navigator.navigateBack() }) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import ru.ldralighieri.composites.sample.navigation.CompositesFiberglassArgs
import ru.ldralighieri.composites.sample.navigation.CompositesFiberglassColumnRoute
import ru.ldralighieri.composites.sample.navigation.CompositesFiberglassGridRoute
import ru.ldralighieri.composites.sample.navigation.CompositesFiberglassExampleRoute
import ru.ldralighieri.composites.sample.navigation.FiberglassType
import ru.ldralighieri.composites.sample.navigation.LocalNavigator
import ru.ldralighieri.composites.sample.navigation.Navigator
import ru.ldralighieri.composites.sample.theme.AppTheme
Expand Down Expand Up @@ -70,18 +70,14 @@ internal fun FiberglassRootScreen(args: CompositesFiberglassArgs) {
FiberglassScreenItem(
title = "Column",
onClick = {
navigator.navigateTo(
CompositesFiberglassColumnRoute.create(title = "Fiberglass column"),
)
navigator.navigateTo(CompositesFiberglassExampleRoute.create(FiberglassType.Column))
},
)

FiberglassScreenItem(
title = "Grid",
onClick = {
navigator.navigateTo(
CompositesFiberglassGridRoute.create(title = "Fiberglass grid"),
)
navigator.navigateTo(CompositesFiberglassExampleRoute.create(FiberglassType.Grid))
},
)
}
Expand Down

0 comments on commit f85f2d1

Please sign in to comment.