diff --git a/build.gradle.kts b/build.gradle.kts index dbca9edf6..47f83c711 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -27,6 +27,8 @@ plugins { id("artifacts-check") id("dependency-guard") alias(libs.plugins.ktlint) + alias(libs.plugins.com.android.application) apply false + alias(libs.plugins.org.jetbrains.kotlin.android) apply false } shardConnectedCheckTasks(project) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 06fb5abd7..4a53c87d0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -85,6 +85,8 @@ timber = "5.0.1" truth = "1.1.5" turbine = "1.0.0" vanniktech-publish = "0.25.2" +agp = "7.4.2" +org-jetbrains-kotlin-android = "1.8.10" [plugins] @@ -100,6 +102,8 @@ kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", versi ktlint = { id = "com.rickbusarow.ktlint", version.ref = "ktlint-gradle" } kotlinx-apiBinaryCompatibility = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "kotlinx-binary-compatibility" } mavenPublish = { id = "com.vanniktech.maven.publish", version.ref = "vanniktech-publish" } +com-android-application = { id = "com.android.application", version.ref = "agp" } +org-jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "org-jetbrains-kotlin-android" } [libraries] @@ -254,5 +258,7 @@ truth = { module = "com.google.truth:truth", version.ref = "truth" } turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" } vanniktech-publish = { module = "com.vanniktech:gradle-maven-publish-plugin", version.ref = "vanniktech-publish" } +ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +material3 = { group = "androidx.compose.material3", name = "material3" } [bundles] diff --git a/samples/petfinder/.gitignore b/samples/petfinder/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/samples/petfinder/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/samples/petfinder/build.gradle.kts b/samples/petfinder/build.gradle.kts new file mode 100644 index 000000000..20d8ede48 --- /dev/null +++ b/samples/petfinder/build.gradle.kts @@ -0,0 +1,70 @@ +@Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed +plugins { + alias(libs.plugins.com.android.application) + alias(libs.plugins.org.jetbrains.kotlin.android) +} + +android { + namespace = "com.squareup.sample.petfinder" + compileSdk = 33 + + defaultConfig { + applicationId = "com.squareup.sample.petfinder" + minSdk = 24 + targetSdk = 33 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.4.3" + } + packagingOptions { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +dependencies { + + implementation(libs.androidx.core) + implementation(libs.androidx.lifecycle.ktx) + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.compose.ui) + implementation(libs.androidx.compose.ui.graphics) + implementation(libs.androidx.compose.ui.tooling.preview) + implementation(libs.material3) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.test.junit) + androidTestImplementation(libs.androidx.test.espresso.core) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.compose.ui.test.junit4) + debugImplementation(libs.androidx.compose.ui.tooling) + debugImplementation(libs.ui.test.manifest) +} diff --git a/samples/petfinder/proguard-rules.pro b/samples/petfinder/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/samples/petfinder/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/samples/petfinder/src/androidTest/java/com/squareup/sample/petfinder/ExampleInstrumentedTest.kt b/samples/petfinder/src/androidTest/java/com/squareup/sample/petfinder/ExampleInstrumentedTest.kt new file mode 100644 index 000000000..41f7548f7 --- /dev/null +++ b/samples/petfinder/src/androidTest/java/com/squareup/sample/petfinder/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.squareup.sample.petfinder + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.squareup.sample.petfinder", appContext.packageName) + } +} diff --git a/samples/petfinder/src/main/AndroidManifest.xml b/samples/petfinder/src/main/AndroidManifest.xml new file mode 100644 index 000000000..5b1da1974 --- /dev/null +++ b/samples/petfinder/src/main/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + diff --git a/samples/petfinder/src/main/java/com/squareup/sample/petfinder/MainActivity.kt b/samples/petfinder/src/main/java/com/squareup/sample/petfinder/MainActivity.kt new file mode 100644 index 000000000..98129374c --- /dev/null +++ b/samples/petfinder/src/main/java/com/squareup/sample/petfinder/MainActivity.kt @@ -0,0 +1,46 @@ +package com.squareup.sample.petfinder + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import com.squareup.sample.petfinder.theme.WorkflowTheme + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + WorkflowTheme { + // A surface container using the 'background' color from the theme + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + Greeting("Android") + } + } + } + } +} + +@Composable +fun Greeting(name: String, modifier: Modifier = Modifier) { + Text( + text = "Hello $name!", + modifier = modifier + ) +} + +@Preview(showBackground = true) +@Composable +fun GreetingPreview() { + WorkflowTheme { + Greeting("Android") + } +} diff --git a/samples/petfinder/src/main/java/com/squareup/sample/petfinder/domain/Address.kt b/samples/petfinder/src/main/java/com/squareup/sample/petfinder/domain/Address.kt new file mode 100644 index 000000000..5fdda7f39 --- /dev/null +++ b/samples/petfinder/src/main/java/com/squareup/sample/petfinder/domain/Address.kt @@ -0,0 +1,10 @@ +package com.squareup.sample.petfinder.domain + +data class Address ( + val address1: Any? = null, + val address2: Any? = null, + val city: String, + val state: String, + val postcode: String, + val country: String +) diff --git a/samples/petfinder/src/main/java/com/squareup/sample/petfinder/domain/Adoption.kt b/samples/petfinder/src/main/java/com/squareup/sample/petfinder/domain/Adoption.kt new file mode 100644 index 000000000..edda0d382 --- /dev/null +++ b/samples/petfinder/src/main/java/com/squareup/sample/petfinder/domain/Adoption.kt @@ -0,0 +1,6 @@ +package com.squareup.sample.petfinder.domain + +data class Adoption ( + val policy: String? = null, + val url: String? = null +) diff --git a/samples/petfinder/src/main/java/com/squareup/sample/petfinder/domain/Animal.kt b/samples/petfinder/src/main/java/com/squareup/sample/petfinder/domain/Animal.kt new file mode 100644 index 000000000..7b0565193 --- /dev/null +++ b/samples/petfinder/src/main/java/com/squareup/sample/petfinder/domain/Animal.kt @@ -0,0 +1,26 @@ +package com.squareup.sample.petfinder.domain + +data class Animal ( + val id: Long, + val organizationId: String, + val url: String, + val type: String, + val species: String, + val breeds: Breeds, + val colors: Colors, + val age: String, + val gender: String, + val size: String, + val coat: String, + val name: String, + val description: String, + val photos: List, + val videos: List