Compare commits
10 Commits
fa202ff162
...
2ab7afecef
| Author | SHA1 | Date | |
|---|---|---|---|
| 2ab7afecef | |||
|
|
82b7dc7723 | ||
|
|
8b50e72975 | ||
|
|
7097a75f37 | ||
|
|
a5118e6dfe | ||
|
|
8f9aedaebc | ||
|
|
5b8dab87ee | ||
|
|
1c31d367a1 | ||
|
|
14f13dd912 | ||
|
|
94e3827d7c |
6
.github/renovate.json
vendored
Normal file
6
.github/renovate.json
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||||
|
"extends": [
|
||||||
|
"local>android/.github:renovate-config"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -5,17 +5,14 @@ This app contains an order flow for cupcakes with options for quantity, flavor,
|
|||||||
The order details get displayed on an order summary screen and can be shared to another app to
|
The order details get displayed on an order summary screen and can be shared to another app to
|
||||||
send the order.
|
send the order.
|
||||||
|
|
||||||
TODO
|
|
||||||
|
|
||||||
|
|
||||||
Pre-requisites
|
Pre-requisites
|
||||||
--------------
|
--------------
|
||||||
* Experience with Kotlin syntax.
|
* Experience with Kotlin syntax.
|
||||||
* How to create and run a project in Android Studio.
|
* How to create and run a project in Android Studio.
|
||||||
* How to create composable functions
|
* How to create composable functions perubahan2
|
||||||
* TODO
|
|
||||||
|
|
||||||
|
|
||||||
|
perubahan
|
||||||
Getting Started
|
Getting Started
|
||||||
---------------
|
---------------
|
||||||
1. Install Android Studio, if you don't already have it.
|
1. Install Android Studio, if you don't already have it.
|
||||||
|
|||||||
@ -20,12 +20,12 @@ plugins {
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "com.example.cupcake"
|
namespace = "com.example.cupcake"
|
||||||
compileSdk = 33
|
compileSdk = 34
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId = "com.example.cupcake"
|
applicationId = "com.example.cupcake"
|
||||||
minSdk = 24
|
minSdk = 24
|
||||||
targetSdk = 33
|
targetSdk = 34
|
||||||
versionCode = 1
|
versionCode = 1
|
||||||
versionName = "1.0"
|
versionName = "1.0"
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ android {
|
|||||||
compose = true
|
compose = true
|
||||||
}
|
}
|
||||||
composeOptions {
|
composeOptions {
|
||||||
kotlinCompilerExtensionVersion = "1.4.7"
|
kotlinCompilerExtensionVersion = "1.5.3"
|
||||||
}
|
}
|
||||||
packaging {
|
packaging {
|
||||||
resources {
|
resources {
|
||||||
@ -67,24 +67,24 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
||||||
implementation(platform("androidx.compose:compose-bom:2023.05.01"))
|
implementation(platform("androidx.compose:compose-bom:2023.10.01"))
|
||||||
implementation("androidx.activity:activity-compose:1.7.2")
|
implementation("androidx.activity:activity-compose:1.8.0")
|
||||||
implementation("androidx.compose.material3:material3")
|
implementation("androidx.compose.material3:material3")
|
||||||
implementation("androidx.compose.runtime:runtime")
|
implementation("androidx.compose.runtime:runtime")
|
||||||
implementation("androidx.compose.runtime:runtime-livedata")
|
implementation("androidx.compose.runtime:runtime-livedata")
|
||||||
implementation("androidx.compose.ui:ui")
|
implementation("androidx.compose.ui:ui")
|
||||||
implementation("androidx.compose.ui:ui-graphics")
|
implementation("androidx.compose.ui:ui-graphics")
|
||||||
implementation("androidx.compose.ui:ui-tooling-preview")
|
implementation("androidx.compose.ui:ui-tooling-preview")
|
||||||
implementation("androidx.core:core-ktx:1.10.1")
|
implementation("androidx.core:core-ktx:1.12.0")
|
||||||
implementation("androidx.lifecycle:lifecycle-livedata-ktx:${rootProject.extra["lifecycle_version"]}")
|
implementation("androidx.lifecycle:lifecycle-livedata-ktx:${rootProject.extra["lifecycle_version"]}")
|
||||||
implementation("androidx.lifecycle:lifecycle-runtime-ktx:${rootProject.extra["lifecycle_version"]}")
|
implementation("androidx.lifecycle:lifecycle-runtime-ktx:${rootProject.extra["lifecycle_version"]}")
|
||||||
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:${rootProject.extra["lifecycle_version"]}")
|
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:${rootProject.extra["lifecycle_version"]}")
|
||||||
implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:${rootProject.extra["lifecycle_version"]}")
|
implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:${rootProject.extra["lifecycle_version"]}")
|
||||||
implementation("androidx.navigation:navigation-compose:2.5.3")
|
implementation("androidx.navigation:navigation-compose:2.7.4")
|
||||||
|
|
||||||
androidTestImplementation(platform("androidx.compose:compose-bom:2023.05.01"))
|
androidTestImplementation(platform("androidx.compose:compose-bom:2023.10.01"))
|
||||||
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
|
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
|
||||||
androidTestImplementation("androidx.navigation:navigation-testing:2.5.3")
|
androidTestImplementation("androidx.navigation:navigation-testing:2.7.4")
|
||||||
androidTestImplementation("androidx.test.espresso:espresso-intents:3.5.1")
|
androidTestImplementation("androidx.test.espresso:espresso-intents:3.5.1")
|
||||||
androidTestImplementation("androidx.test.ext:junit:1.1.5")
|
androidTestImplementation("androidx.test.ext:junit:1.1.5")
|
||||||
|
|
||||||
|
|||||||
@ -76,25 +76,25 @@ class CupcakeOrderScreenTest {
|
|||||||
@Test
|
@Test
|
||||||
fun selectOptionScreen_verifyContent() {
|
fun selectOptionScreen_verifyContent() {
|
||||||
// Given list of options
|
// Given list of options
|
||||||
val flavours = listOf("Vanilla", "Chocolate", "Hazelnut", "Cookie", "Mango")
|
val flavors = listOf("Vanilla", "Chocolate", "Hazelnut", "Cookie", "Mango")
|
||||||
// And sub total
|
// And subtotal
|
||||||
val subTotal = "$100"
|
val subtotal = "$100"
|
||||||
|
|
||||||
// When SelectOptionScreen is loaded
|
// When SelectOptionScreen is loaded
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
SelectOptionScreen(subtotal = subTotal, options = flavours)
|
SelectOptionScreen(subtotal = subtotal, options = flavors)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Then all the options are displayed on the screen.
|
// Then all the options are displayed on the screen.
|
||||||
flavours.forEach { flavour ->
|
flavors.forEach { flavor ->
|
||||||
composeTestRule.onNodeWithText(flavour).assertIsDisplayed()
|
composeTestRule.onNodeWithText(flavor).assertIsDisplayed()
|
||||||
}
|
}
|
||||||
|
|
||||||
// And then the subtotal is displayed correctly.
|
// And then the subtotal is displayed correctly.
|
||||||
composeTestRule.onNodeWithText(
|
composeTestRule.onNodeWithText(
|
||||||
composeTestRule.activity.getString(
|
composeTestRule.activity.getString(
|
||||||
R.string.subtotal_price,
|
R.string.subtotal_price,
|
||||||
subTotal
|
subtotal
|
||||||
)
|
)
|
||||||
).assertIsDisplayed()
|
).assertIsDisplayed()
|
||||||
|
|
||||||
@ -148,6 +148,6 @@ class CupcakeOrderScreenTest {
|
|||||||
R.string.subtotal_price,
|
R.string.subtotal_price,
|
||||||
fakeOrderUiState.price
|
fakeOrderUiState.price
|
||||||
)
|
)
|
||||||
)
|
).assertIsDisplayed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,6 +21,8 @@ import androidx.annotation.StringRes
|
|||||||
import androidx.compose.foundation.layout.fillMaxHeight
|
import androidx.compose.foundation.layout.fillMaxHeight
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.rememberScrollState
|
||||||
|
import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.ArrowBack
|
import androidx.compose.material.icons.filled.ArrowBack
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
@ -115,7 +117,10 @@ fun CupcakeApp(
|
|||||||
NavHost(
|
NavHost(
|
||||||
navController = navController,
|
navController = navController,
|
||||||
startDestination = CupcakeScreen.Start.name,
|
startDestination = CupcakeScreen.Start.name,
|
||||||
modifier = Modifier.padding(innerPadding)
|
modifier = Modifier
|
||||||
|
.fillMaxSize()
|
||||||
|
.verticalScroll(rememberScrollState())
|
||||||
|
.padding(innerPadding)
|
||||||
) {
|
) {
|
||||||
composable(route = CupcakeScreen.Start.name) {
|
composable(route = CupcakeScreen.Start.name) {
|
||||||
StartOrderScreen(
|
StartOrderScreen(
|
||||||
|
|||||||
@ -18,13 +18,13 @@ package com.example.cupcake
|
|||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.core.view.WindowCompat
|
import androidx.activity.enableEdgeToEdge
|
||||||
import com.example.cupcake.ui.theme.CupcakeTheme
|
import com.example.cupcake.ui.theme.CupcakeTheme
|
||||||
|
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
enableEdgeToEdge()
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
|
||||||
setContent {
|
setContent {
|
||||||
CupcakeTheme {
|
CupcakeTheme {
|
||||||
CupcakeApp()
|
CupcakeApp()
|
||||||
|
|||||||
@ -39,6 +39,7 @@ import androidx.compose.ui.res.stringResource
|
|||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import com.example.cupcake.R
|
import com.example.cupcake.R
|
||||||
import com.example.cupcake.ui.components.FormattedPriceLabel
|
import com.example.cupcake.ui.components.FormattedPriceLabel
|
||||||
|
import com.example.cupcake.ui.theme.CupcakeTheme
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Composable that displays the list of items as [RadioButton] options,
|
* Composable that displays the list of items as [RadioButton] options,
|
||||||
@ -54,14 +55,14 @@ fun SelectOptionScreen(
|
|||||||
onCancelButtonClicked: () -> Unit = {},
|
onCancelButtonClicked: () -> Unit = {},
|
||||||
onNextButtonClicked: () -> Unit = {},
|
onNextButtonClicked: () -> Unit = {},
|
||||||
modifier: Modifier = Modifier
|
modifier: Modifier = Modifier
|
||||||
){
|
) {
|
||||||
var selectedValue by rememberSaveable { mutableStateOf("") }
|
var selectedValue by rememberSaveable { mutableStateOf("") }
|
||||||
|
|
||||||
Column(
|
Column(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
verticalArrangement = Arrangement.SpaceBetween
|
verticalArrangement = Arrangement.SpaceBetween
|
||||||
) {
|
) {
|
||||||
Column(modifier = Modifier.padding(dimensionResource(R.dimen.padding_medium))){
|
Column(modifier = Modifier.padding(dimensionResource(R.dimen.padding_medium))) {
|
||||||
options.forEach { item ->
|
options.forEach { item ->
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier.selectable(
|
modifier = Modifier.selectable(
|
||||||
@ -72,7 +73,7 @@ fun SelectOptionScreen(
|
|||||||
}
|
}
|
||||||
),
|
),
|
||||||
verticalAlignment = Alignment.CenterVertically
|
verticalAlignment = Alignment.CenterVertically
|
||||||
){
|
) {
|
||||||
RadioButton(
|
RadioButton(
|
||||||
selected = selectedValue == item,
|
selected = selectedValue == item,
|
||||||
onClick = {
|
onClick = {
|
||||||
@ -100,12 +101,14 @@ fun SelectOptionScreen(
|
|||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.padding(dimensionResource(R.dimen.padding_medium))
|
.padding(dimensionResource(R.dimen.padding_medium)),
|
||||||
.weight(1f, false),
|
|
||||||
horizontalArrangement = Arrangement.spacedBy(dimensionResource(R.dimen.padding_medium)),
|
horizontalArrangement = Arrangement.spacedBy(dimensionResource(R.dimen.padding_medium)),
|
||||||
verticalAlignment = Alignment.Bottom
|
verticalAlignment = Alignment.Bottom
|
||||||
){
|
) {
|
||||||
OutlinedButton(modifier = Modifier.weight(1f), onClick = onCancelButtonClicked) {
|
OutlinedButton(
|
||||||
|
modifier = Modifier.weight(1f),
|
||||||
|
onClick = onCancelButtonClicked
|
||||||
|
) {
|
||||||
Text(stringResource(R.string.cancel))
|
Text(stringResource(R.string.cancel))
|
||||||
}
|
}
|
||||||
Button(
|
Button(
|
||||||
@ -123,10 +126,12 @@ fun SelectOptionScreen(
|
|||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun SelectOptionPreview(){
|
fun SelectOptionPreview() {
|
||||||
|
CupcakeTheme {
|
||||||
SelectOptionScreen(
|
SelectOptionScreen(
|
||||||
subtotal = "299.99",
|
subtotal = "299.99",
|
||||||
options = listOf("Option 1", "Option 2", "Option 3", "Option 4"),
|
options = listOf("Option 1", "Option 2", "Option 3", "Option 4"),
|
||||||
modifier = Modifier.fillMaxHeight()
|
modifier = Modifier.fillMaxHeight()
|
||||||
)
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,9 +19,7 @@ import androidx.annotation.StringRes
|
|||||||
import androidx.compose.foundation.Image
|
import androidx.compose.foundation.Image
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.fillMaxHeight
|
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.height
|
import androidx.compose.foundation.layout.height
|
||||||
@ -41,6 +39,7 @@ import androidx.compose.ui.tooling.preview.Preview
|
|||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.example.cupcake.R
|
import com.example.cupcake.R
|
||||||
import com.example.cupcake.data.DataSource
|
import com.example.cupcake.data.DataSource
|
||||||
|
import com.example.cupcake.ui.theme.CupcakeTheme
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Composable that allows the user to select the desired cupcake quantity and expects
|
* Composable that allows the user to select the desired cupcake quantity and expects
|
||||||
@ -52,7 +51,7 @@ fun StartOrderScreen(
|
|||||||
quantityOptions: List<Pair<Int, Int>>,
|
quantityOptions: List<Pair<Int, Int>>,
|
||||||
onNextButtonClicked: (Int) -> Unit,
|
onNextButtonClicked: (Int) -> Unit,
|
||||||
modifier: Modifier = Modifier
|
modifier: Modifier = Modifier
|
||||||
){
|
) {
|
||||||
Column(
|
Column(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
verticalArrangement = Arrangement.SpaceBetween
|
verticalArrangement = Arrangement.SpaceBetween
|
||||||
@ -75,7 +74,6 @@ fun StartOrderScreen(
|
|||||||
)
|
)
|
||||||
Spacer(modifier = Modifier.height(dimensionResource(R.dimen.padding_small)))
|
Spacer(modifier = Modifier.height(dimensionResource(R.dimen.padding_small)))
|
||||||
}
|
}
|
||||||
Row(modifier = Modifier.weight(1f, false)) {
|
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
@ -86,12 +84,12 @@ fun StartOrderScreen(
|
|||||||
quantityOptions.forEach { item ->
|
quantityOptions.forEach { item ->
|
||||||
SelectQuantityButton(
|
SelectQuantityButton(
|
||||||
labelResourceId = item.first,
|
labelResourceId = item.first,
|
||||||
onClick = { onNextButtonClicked(item.second) }
|
onClick = { onNextButtonClicked(item.second) },
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -103,7 +101,7 @@ fun SelectQuantityButton(
|
|||||||
@StringRes labelResourceId: Int,
|
@StringRes labelResourceId: Int,
|
||||||
onClick: () -> Unit,
|
onClick: () -> Unit,
|
||||||
modifier: Modifier = Modifier
|
modifier: Modifier = Modifier
|
||||||
){
|
) {
|
||||||
Button(
|
Button(
|
||||||
onClick = onClick,
|
onClick = onClick,
|
||||||
modifier = modifier.widthIn(min = 250.dp)
|
modifier = modifier.widthIn(min = 250.dp)
|
||||||
@ -114,10 +112,14 @@ fun SelectQuantityButton(
|
|||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun StartOrderPreview(){
|
fun StartOrderPreview() {
|
||||||
|
CupcakeTheme {
|
||||||
StartOrderScreen(
|
StartOrderScreen(
|
||||||
quantityOptions = DataSource.quantityOptions,
|
quantityOptions = DataSource.quantityOptions,
|
||||||
onNextButtonClicked = {},
|
onNextButtonClicked = {},
|
||||||
modifier = Modifier.fillMaxSize().padding(dimensionResource(R.dimen.padding_medium))
|
modifier = Modifier
|
||||||
|
.fillMaxSize()
|
||||||
|
.padding(dimensionResource(R.dimen.padding_medium))
|
||||||
)
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,6 +38,7 @@ import androidx.compose.ui.tooling.preview.Preview
|
|||||||
import com.example.cupcake.R
|
import com.example.cupcake.R
|
||||||
import com.example.cupcake.data.OrderUiState
|
import com.example.cupcake.data.OrderUiState
|
||||||
import com.example.cupcake.ui.components.FormattedPriceLabel
|
import com.example.cupcake.ui.components.FormattedPriceLabel
|
||||||
|
import com.example.cupcake.ui.theme.CupcakeTheme
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This composable expects [orderUiState] that represents the order state, [onCancelButtonClicked]
|
* This composable expects [orderUiState] that represents the order state, [onCancelButtonClicked]
|
||||||
@ -50,7 +51,7 @@ fun OrderSummaryScreen(
|
|||||||
onCancelButtonClicked: () -> Unit,
|
onCancelButtonClicked: () -> Unit,
|
||||||
onSendButtonClicked: (String, String) -> Unit,
|
onSendButtonClicked: (String, String) -> Unit,
|
||||||
modifier: Modifier = Modifier
|
modifier: Modifier = Modifier
|
||||||
){
|
) {
|
||||||
val resources = LocalContext.current.resources
|
val resources = LocalContext.current.resources
|
||||||
|
|
||||||
val numberOfCupcakes = resources.getQuantityString(
|
val numberOfCupcakes = resources.getQuantityString(
|
||||||
@ -97,9 +98,7 @@ fun OrderSummaryScreen(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier.padding(dimensionResource(R.dimen.padding_medium))
|
||||||
.weight(1f, false)
|
|
||||||
.padding(dimensionResource(R.dimen.padding_medium))
|
|
||||||
) {
|
) {
|
||||||
Column(
|
Column(
|
||||||
verticalArrangement = Arrangement.spacedBy(dimensionResource(R.dimen.padding_small))
|
verticalArrangement = Arrangement.spacedBy(dimensionResource(R.dimen.padding_small))
|
||||||
@ -123,11 +122,13 @@ fun OrderSummaryScreen(
|
|||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun OrderSummaryPreview(){
|
fun OrderSummaryPreview() {
|
||||||
|
CupcakeTheme {
|
||||||
OrderSummaryScreen(
|
OrderSummaryScreen(
|
||||||
orderUiState = OrderUiState(0, "Test", "Test", "$300.00"),
|
orderUiState = OrderUiState(0, "Test", "Test", "$300.00"),
|
||||||
onSendButtonClicked = { subject: String, summary: String -> },
|
onSendButtonClicked = { subject: String, summary: String -> },
|
||||||
onCancelButtonClicked = {},
|
onCancelButtonClicked = {},
|
||||||
modifier = Modifier.fillMaxHeight()
|
modifier = Modifier.fillMaxHeight()
|
||||||
)
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
75
app/src/main/res/drawable/spageti.xml
Normal file
75
app/src/main/res/drawable/spageti.xml
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="800dp"
|
||||||
|
android:height="800dp"
|
||||||
|
android:viewportWidth="64"
|
||||||
|
android:viewportHeight="64">
|
||||||
|
<path
|
||||||
|
android:pathData="M58,49.2C58,56.3 46.3,62 32,62C17.6,62 6,56.3 6,49.2c0,-7.1 11.6,-12.8 26,-12.8c14.3,0 26,5.7 26,12.8"
|
||||||
|
android:fillColor="#94989b"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M62,44c0,8.6 -13.4,15.7 -30,15.7S2,52.7 2,44c0,-8.6 13.4,-15.7 30,-15.7s30,7 30,15.7"
|
||||||
|
android:fillColor="#c7d7d7"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M56.7,42.7c0,5.8 -11.1,10.4 -24.7,10.4S7.3,48.4 7.3,42.7c0,-5.8 11.1,-10.4 24.7,-10.4c13.6,-0.1 24.7,4.6 24.7,10.4"
|
||||||
|
android:fillColor="#94989b"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M50.2,50.5c-2.8,0.5 -3.3,3.7 -11.4,2.9c-3.8,-0.4 -6,0.8 -10.7,1.2S-1.8,50.2 8.4,38.7c10.1,-11.5 48.4,-6.2 48.8,1.2c0.4,7.5 -4.8,10.2 -7,10.6"
|
||||||
|
android:fillColor="#d3976e"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M8.4,19.4c-0.9,0.6 0.3,0.6 0.3,0.6s10.2,-3.5 10.7,-2.5s-10.3,4 -10.1,5.2c0.2,1.2 11,-3.4 11.2,-2.4c0.3,1 -9.8,4.8 -9.8,4.8s-0.8,0.8 0.2,0.7c13,-1.6 17.1,-5.5 17.1,-5.5s0.9,-0.7 0.6,-1.6c0,-0.1 28.4,-10.2 32.2,-11.6c1.9,-0.7 -0.1,-5.7 -1.9,-5C55,3.4 26.6,13.7 26.6,13.7c-0.3,-0.9 -1.5,-0.9 -1.5,-0.9s-5.7,-0.4 -16.7,6.6"
|
||||||
|
android:fillColor="#839391"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M57.6,39.8c-0.3,-2.1 -2.7,-4 -7.1,-5.6c-2.6,-2.1 -6.3,-2.7 -8.6,-2.9c-2.1,-0.1 -4.2,0 -6.2,0.4c-0.9,0.1 -1.9,-0.9 -2.7,-0.6c-4.3,-1.2 -8.2,1 -11,1c-3,0 -15,2 -14.9,8.2c-0.5,0.6 -3.1,2.7 0.9,4.3c-1,1.1 -1.2,2.2 -1.1,2.9c0.2,1.6 1.5,3.1 4,4.3c3.7,1.8 6.9,2.4 9.4,2.4C24,54 25.8,57.8 34,57l-1,-2c-0.1,0 -3,0 -6,-2c0.1,0 17.8,-1.2 20,-1.5c5,-0.5 8.6,-4.6 9,-6.5c0.3,-1.4 1.8,-4.1 1.6,-5.2m-31.3,-6c0.3,0 -5.9,2.6 -9.3,4.2l0.6,-2.6h0.1c2.4,-0.8 5.3,-1.3 8.6,-1.6m17.4,15.9s-1.2,-1.3 -1.1,-1.5c1.3,-0.2 2.5,-0.4 3.7,-0.7c-0.5,1 -1.4,1.7 -2.6,2.2m-0.1,0c-0.1,0 -0.1,0 -0.2,0.1c0,0 0.1,0 0.2,-0.1M25,44.3c0.4,0.1 8.7,2 11.8,2.5C35,48 29,49 25,44.3M16,51s-2.1,-2.9 -2,-4c0.7,0.6 3.1,1.3 4,1.5c0.1,0.2 1.6,2.9 2,3.5c-2,0 -4,-1 -4,-1m1.1,-7.2c0,0.7 0,1.4 0.2,2.2c-1.8,-0.4 -3.3,-1.1 -4.3,-2c1,-0.3 2.4,-0.4 4.1,-0.2M39,33c6,2 9.8,4.8 10,5c-0.2,0.4 0.2,1.6 0,2c-0.8,-0.4 -7,-5 -11,-6c0.7,-0.1 1,-1 1,-1m9,11c0.5,-0.4 3,-3 3,-3h2c0.6,0 -2.7,3.6 -3,4c-0.3,-0.1 -1.7,-0.9 -2,-1m-0.9,4.2c0.2,-0.3 0.3,-0.6 0.4,-0.9c0.5,-0.1 1,-0.3 1.5,-0.4c0.3,0.5 0.6,0.9 1,1.4c-0.8,0.4 -1.8,0.8 -2.9,1.2c-0.5,0.2 -1,0.3 -1.4,0.5c0.5,-0.6 1.1,-1.1 1.4,-1.8m-35.2,-8c-0.3,0.4 -0.5,0.7 -0.6,1.1c-0.6,-0.1 -1.2,-0.3 -1.8,-0.5c-0.4,-0.2 -0.6,-0.3 -0.9,-0.5c0.8,-0.8 1.9,-1.6 3.3,-2.4v2.3M11,47c0.1,-0.4 0.4,-0.8 0.9,-1.2c-0.3,1.4 0.2,2.9 1.3,4.3c-0.1,0 -0.2,-0.1 -0.2,-0.1c-1.5,-1 -2.1,-2.2 -2,-3m8,-3.2c0.9,0.2 5.9,3 6.9,3.3c-0.9,0 -4.9,-0.1 -6.9,-1.1c-0.2,-0.7 -0.2,-1.4 0,-2.2m21.3,4.6c-0.1,0.4 0,0.7 0.2,1c0.4,0.6 -0.8,0.8 -2.3,0c-0.5,-0.3 -0.7,-0.6 -0.8,-0.9c0.9,0.1 1.9,0 2.9,-0.1m11.5,-1.2c-0.2,-0.3 -0.5,-0.6 -0.8,-1c0.3,-0.1 0.6,-0.2 0.9,-0.4c0.5,0.1 0.8,0.3 1,0.4c-0.2,0.3 -0.6,0.6 -1.1,1m-30.3,3c-0.7,-0.3 -1,-1 -1.4,-1.5C27,48 35.2,50.6 36,51c0.1,0.1 -10,1 -14.5,-0.8m33.6,-7.4c0.9,-2.8 -3,-5.7 -3.1,-5.8c1,0 5,2 3.1,5.8"
|
||||||
|
android:fillColor="#ffe299"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M13,35V20.3c0,-0.4 -0.6,-0.7 -1.2,-0.7s-1.2,0.3 -1.2,0.7V36l2.4,-1"
|
||||||
|
android:fillColor="#ffe299"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M16,42V15.2c0,-0.4 -0.6,-0.7 -1.2,-0.7s-1.2,0.3 -1.2,0.7V42H16"
|
||||||
|
android:fillColor="#ffe299"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M18.9,26.9c0.7,0 1.2,-0.3 1.2,-0.7V13.4c0,-0.4 -0.6,-0.7 -1.2,-0.7s-1.2,0.3 -1.2,0.7v12.7c0,0.5 0.6,0.8 1.2,0.8"
|
||||||
|
android:fillColor="#ffe299"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M15.2,41.1c1,2 2.5,0.8 3.2,3c0.7,2.2 2.4,-0.2 3.9,1.1s5.5,0.6 7.2,0.9c1.7,0.3 1.9,-0.9 3.9,-0.3c2,0.7 1.7,-1.9 6.4,-0.2c1.5,0.6 1.1,-1.7 3.6,-1.1c2.5,0.6 0.7,-1.9 3.8,-1.7c3.1,0.2 -2.4,-6.3 -5.1,-5.5c-2.7,0.8 -6,-4.5 -10,-4.5c-8.3,0.2 -18.3,5.8 -16.9,8.3"
|
||||||
|
android:fillColor="#ec6430"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M21.5,36.5l-0.7,1.5l0.7,1.5l0.7,-1.5z"
|
||||||
|
android:fillColor="#8cc63e"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M24.5,34l-0.5,1l0.5,1l0.5,-1z"
|
||||||
|
android:fillColor="#8cc63e"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M27.5,37l-0.5,1l0.5,1l0.5,-1z"
|
||||||
|
android:fillColor="#8cc63e"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M28.5,32.5l-0.7,1.5l0.7,1.5l0.7,-1.5z"
|
||||||
|
android:fillColor="#8cc63e"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M31.5,35.5l-0.7,1.5l0.7,1.5l0.7,-1.5z"
|
||||||
|
android:fillColor="#8cc63e"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M34.5,33l-0.5,1l0.5,1l0.5,-1z"
|
||||||
|
android:fillColor="#8cc63e"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M37.5,37l-0.5,1l0.5,1l0.5,-1z"
|
||||||
|
android:fillColor="#8cc63e"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M40.5,36.5l-0.7,1.5l0.7,1.5l0.7,-1.5z"
|
||||||
|
android:fillColor="#8cc63e"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M44.5,39l-0.5,1l0.5,1l0.5,-1z"
|
||||||
|
android:fillColor="#8cc63e"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M34.5,39l-0.5,1l0.5,1l0.5,-1z"
|
||||||
|
android:fillColor="#8cc63e"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M30.5,41l-0.5,1l0.5,1l0.5,-1z"
|
||||||
|
android:fillColor="#8cc63e"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M24.5,39l-0.5,1l0.5,1l0.5,-1z"
|
||||||
|
android:fillColor="#8cc63e"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M18.5,38l-0.5,1l0.5,1l0.5,-1z"
|
||||||
|
android:fillColor="#8cc63e"/>
|
||||||
|
</vector>
|
||||||
18
app/src/main/res/drawable/spagheti.xml
Normal file
18
app/src/main/res/drawable/spagheti.xml
Normal file
File diff suppressed because one or more lines are too long
@ -16,11 +16,11 @@
|
|||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
buildscript {
|
buildscript {
|
||||||
extra.apply {
|
extra.apply {
|
||||||
set("lifecycle_version", "2.6.1")
|
set("lifecycle_version", "2.6.2")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
plugins {
|
plugins {
|
||||||
id("com.android.application") version "8.0.2" apply false
|
id("com.android.application") version "8.1.2" apply false
|
||||||
id("com.android.library") version "8.0.2" apply false
|
id("com.android.library") version "8.1.2" apply false
|
||||||
id("org.jetbrains.kotlin.android") version "1.8.21" apply false
|
id("org.jetbrains.kotlin.android") version "1.9.10" apply false
|
||||||
}
|
}
|
||||||
|
|||||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,6 @@
|
|||||||
#Sun Mar 19 17:30:22 PDT 2023
|
#Sun Mar 19 17:30:22 PDT 2023
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user