├── .gitignore ├── .idea ├── .gitignore ├── .name ├── compiler.xml ├── deploymentTargetDropDown.xml ├── gradle.xml ├── misc.xml └── vcs.xml ├── MyKotlin ├── .gitignore ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── bawp │ └── mykotlin │ ├── EnumSealedExample.kt │ └── MyClass.kt ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── bawp │ │ └── myfirstcompose │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── bawp │ │ │ └── myfirstcompose │ │ │ ├── MainActivity.kt │ │ │ └── ui │ │ │ └── theme │ │ │ ├── Color.kt │ │ │ ├── Shape.kt │ │ │ ├── Theme.kt │ │ │ └── Type.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── values-night │ │ └── themes.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml │ └── test │ └── java │ └── com │ └── bawp │ └── myfirstcompose │ └── ExampleUnitTest.kt ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | MyFirstCompose -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/deploymentTargetDropDown.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | 13 | 14 | 16 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /MyKotlin/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /MyKotlin/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-library' 3 | id 'kotlin' 4 | } 5 | 6 | java { 7 | sourceCompatibility = JavaVersion.VERSION_1_7 8 | targetCompatibility = JavaVersion.VERSION_1_7 9 | } -------------------------------------------------------------------------------- /MyKotlin/src/main/java/com/bawp/mykotlin/EnumSealedExample.kt: -------------------------------------------------------------------------------- 1 | package com.bawp.mykotlin 2 | 3 | import java.io.IOException 4 | import java.lang.NullPointerException 5 | 6 | 7 | sealed class Result 8 | 9 | data class Success(val dataFetched: String?): Result() 10 | data class Error(val exception: Exception): Result() 11 | object NotLoading: Result() 12 | object Loading: Result() 13 | 14 | 15 | sealed class Failure: Result() { 16 | data class CustomFailure(val customFailure: IOException): Failure() 17 | data class AnotherCustomFailure(val anotherCustomFailure: NullPointerException): Failure() 18 | } 19 | fun main() { 20 | Repository.startFetch() 21 | getResult(result = Repository.getCurrentState()) 22 | Repository.finishedFetch() 23 | getResult(result = Repository.getCurrentState()) 24 | Repository.error() 25 | getResult(result = Repository.getCurrentState()) 26 | 27 | Repository.anotherCustomFailure() 28 | getResult(result = Repository.getCurrentState()) 29 | Repository.customFailure() 30 | getResult(result = Repository.getCurrentState()) 31 | 32 | } 33 | fun getResult(result: Result) { 34 | return when(result) { 35 | is Error -> { 36 | println(result.exception.toString()) 37 | } 38 | is Success -> { 39 | println(result.dataFetched?: "Ensure you start the fetch function first") 40 | } 41 | is Loading -> { 42 | println("com.bawp.mykotlin.Loading...") 43 | } 44 | is NotLoading -> { 45 | println("Idle") 46 | } 47 | is Failure.AnotherCustomFailure -> { 48 | println(result.anotherCustomFailure.toString()) 49 | } 50 | is Failure.CustomFailure -> { 51 | println(result.customFailure.toString()) 52 | } 53 | 54 | } 55 | } 56 | 57 | object Repository { 58 | private var loadState: Result = NotLoading 59 | private var dataFetched: String? = null 60 | fun startFetch() { 61 | loadState = Loading 62 | dataFetched = "data" 63 | } 64 | fun finishedFetch() { 65 | loadState = Success(dataFetched) 66 | dataFetched = null 67 | } 68 | fun error() { 69 | loadState = Error(exception = Exception("Exception")) 70 | } 71 | 72 | fun getCurrentState(): Result { 73 | return loadState 74 | } 75 | fun anotherCustomFailure() { 76 | loadState = 77 | Failure.AnotherCustomFailure(anotherCustomFailure = NullPointerException("something went wrong!")) 78 | } 79 | fun customFailure() { 80 | loadState = Failure.CustomFailure(customFailure = IOException("Custom failure")) 81 | } 82 | 83 | } 84 | 85 | //enum class com.bawp.mykotlin.Result { 86 | // SUCCESS, 87 | // ERROR, 88 | // IDLE, 89 | // LOADING 90 | //} 91 | 92 | -------------------------------------------------------------------------------- /MyKotlin/src/main/java/com/bawp/mykotlin/MyClass.kt: -------------------------------------------------------------------------------- 1 | package com.bawp.mykotlin 2 | 3 | 4 | fun main() { 5 | /** 6 | * var - mutable 7 | * val - immutable 8 | * Best practice - In essence, use val over var 9 | * 10 | * val name: String = "James" - explicitly initializing a variable 11 | * 12 | * Another way to initialize variables 13 | * val name: String 14 | * name = "James" 15 | * Basic Types in Kotlin: 16 | * (Whole Numbers) 17 | * - Int 18 | * - Byte 19 | * - Short 20 | * Floating Points Types: 21 | * (Decimal Numbers): 22 | * - Double 23 | * - Float 24 | * Note: for precision, use Double. 25 | * val e = 2.7182818284 26 | val eFloat = 2.7182818284f 27 | val amount = 0 28 | when (amount) { 29 | in 1..100 -> print("This amount is between 1 and 100") 30 | !in 10..90 -> print("This amount is outside the range") 31 | 999 -> print("Really Close") 32 | 1000 -> print("Rich but not there...") 33 | 1100 -> print("You've made it!") 34 | else -> { 35 | print("$amount is just not going to work") 36 | } 37 | } 38 | 39 | // calculate(first = 12, 40 | // second = 199, 41 | // message = "Hey", 42 | // multipleOf = 2) 43 | // calculate( message = "Hello there", multipleOf = 3) 44 | val catAge = calculateCatAge(age = 2) 45 | if (checkAge(catAge)) 46 | print("This cat is old ($catAge)") 47 | else 48 | print("This cat is young ($catAge)") 49 | 50 | //Collections - Introduction 51 | val myListOfNames = listOf("James", "Paul", "Rafael", "Gina") 52 | val myMutableList = mutableListOf(12, 34, 45, 123) 53 | 54 | println("Number of elements ${myMutableList.size}") 55 | println("Second element ${myMutableList[1]}") 56 | println("Index of element \"45\" ${myMutableList.indexOf(45)}") 57 | 58 | 59 | for (item in myMutableList) { 60 | println(item) 61 | } 62 | 63 | myListOfNames.forEach { 64 | println(it) 65 | 66 | } 67 | */ 68 | 69 | } 70 | 71 | //Generics 72 | fun createGenerics() { 73 | val lisOfItems = listOf("Rafael", "Gina", "George", "James") 74 | 75 | val person = Person(name = "Joe", lastName = "Ball", age = 23) 76 | val aroni = Person(name = "Ruti", 77 | lastName = "Machava", 78 | age = 54) 79 | val ruti = Person(name = "Ruti", 80 | lastName = "Machava", 81 | age = 54) 82 | val listOfPeople = listOf(person, aroni, ruti) 83 | val listOfNumbers = listOf(23, 45, 45) 84 | val finder = Finder(list = listOfPeople) 85 | finder.findItem(element = aroni ){ 86 | println("Found $it") 87 | } 88 | } 89 | class Finder(private val list: List) { 90 | fun findItem(element: T, foundItem: (element: T?) -> Unit) { 91 | val itemFoundList = list.filter { 92 | it == element 93 | } 94 | if (itemFoundList.isNullOrEmpty()) foundItem(null) else 95 | foundItem(itemFoundList.first()) 96 | 97 | } 98 | } 99 | fun createDataClass() { 100 | val person = Person(name = "Joe", lastName = "Ball", age = 23) 101 | val aroni = Person(name = "Ruti", 102 | lastName = "Machava", 103 | age = 54) 104 | val ruti = Person(name = "Ruti", 105 | lastName = "Machava", 106 | age = 54) 107 | val listOfPeople = listOf(person, aroni, ruti) 108 | listOfPeople.forEach { item -> 109 | println(item.age) 110 | } 111 | } 112 | data class Person(val name: String, val lastName: String, val age: Int) 113 | 114 | //Extension Functions 115 | fun String.append(toAppend: String): String = this.plus(toAppend) 116 | fun String.removeFirstAndLastChars(): String = this.substring(1, this.length - 1) 117 | 118 | //----- 119 | class Button(val label: String): ClickEvent { 120 | override fun onClick(message: String) { 121 | println("Clicked by $label and here's a message $message") 122 | } 123 | 124 | 125 | } 126 | 127 | class Character(val name: String): ClickEvent { 128 | override fun onClick(message: String) { 129 | println("Clicked by $name and here's a message $message") 130 | } 131 | 132 | } 133 | 134 | //Interfaces 135 | interface ClickEvent { 136 | fun onClick(message: String) 137 | 138 | } 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | fun createCar() { 152 | val car = Car(color = "Green", model = "LLm") 153 | car.color = "Black" 154 | println("Car color: ${car.color} model: ${car.model}" ) 155 | car.speed(minSpeed = 100, maxSpeed = 199) 156 | car.drive() 157 | 158 | //Truck 159 | val truck = Truck(color = "Magenta", model = "F16") 160 | truck.drive() 161 | truck.speed(minSpeed = 20, maxSpeed = 90) 162 | } 163 | 164 | 165 | class Truck(color: String, model: String) : Car(color, model) { 166 | override fun speed(minSpeed: Int, maxSpeed: Int) { 167 | val fullSpeed = minSpeed * maxSpeed 168 | println("Truck full speed: $fullSpeed") 169 | 170 | } 171 | 172 | override fun drive() { 173 | println("Vroommm... Like a truck!!!") 174 | } 175 | 176 | } 177 | 178 | 179 | open class Car (var color: String , 180 | val model: String) { 181 | 182 | // init { 183 | // if (color == "Green") { 184 | // 185 | // println("Yayy Green") 186 | // }else { 187 | // println("$color is not Green") 188 | // 189 | // } 190 | // 191 | // } 192 | 193 | open fun speed(minSpeed: Int, maxSpeed: Int) { 194 | println("Min speed is $minSpeed and MaxSpeed: $maxSpeed") 195 | } 196 | open fun drive() { 197 | println("Drive...vroommmm") 198 | } 199 | } 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | //https://medium.com/mobile-app-development-publication/kotlin-collection-functions-cheat-sheet-975371a96c4b 216 | //Collections 217 | fun kCollections() { 218 | val myMutableList = mutableListOf(12, 34, 45, 123) 219 | myMutableList.add(34) 220 | 221 | val empty = emptyList() 222 | val emptySet = emptySet() 223 | val emptyMap = emptyMap() 224 | 225 | //Set 226 | val mySet = setOf("US", "MZ", "AU") 227 | val myMutableSet = mutableSetOf(1,3, 4, 5) 228 | myMutableSet.add(123) 229 | // println(myMutableSet) 230 | 231 | //Map 232 | val secretMap = mapOf("Up" to 1, "Down" to 2, "Left" to 3, 233 | "Right" to 4) 234 | val myMutableSecretMap = mutableMapOf("One" to 1, 235 | "Two" to 2, 236 | "Three" to 3) 237 | myMutableSecretMap["Four"] = 4 238 | //println(myMutableSecretMap) 239 | 240 | //if ("Up" in secretMap) println("Yes is in!") 241 | //if (4 in secretMap.values) println("Yes is in!") 242 | 243 | //Initializing Collections 244 | val myNewList = mutableListOf() 245 | myNewList.add("hey") 246 | myNewList.add("There") 247 | for (i in 1..10) { 248 | myNewList.add(i,"Hey $i") 249 | } 250 | 251 | val myListOfNames = listOf("James", "Paul", "Rafael", "Gina") 252 | 253 | val found = myListOfNames.filter { 254 | it.startsWith("r", ignoreCase = true) && it.endsWith('L', 255 | ignoreCase = true ) 256 | 257 | } 258 | print(found) 259 | 260 | } 261 | 262 | val name: (String) -> Unit = { 263 | print("Hello, my name is $it") 264 | } 265 | 266 | fun showName(name: String) { 267 | print(name) 268 | } 269 | fun enhancedMessage(message: String, funAsParameter: (String) -> Int) { 270 | println("$message ${funAsParameter("Hey")}") 271 | } 272 | val catAge: (Int) -> Int = { 273 | it * 7} 274 | fun calculateCatAge(age: Int): Int = age * 7 275 | 276 | // val lambdaName : Type = { parameterList -> codeBody } 277 | val add: (Int, Int) -> Int = { a, b -> a + b } 278 | 279 | fun sum(a: Int, b: Int): Int { 280 | return a + b 281 | } 282 | fun checkAge(catAge: Int): Boolean { 283 | 284 | return catAge >= 14 285 | } 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | //val checkedAge: (Int) -> Boolean = { catAge: Int -> catAge >= 14 } 304 | fun calculate(first: Int = 10, 305 | second: Int = 1000, 306 | message: String, 307 | multipleOf: Int) { 308 | for (i in first..second) { 309 | if (i%multipleOf == 0) { 310 | println("$i $message $multipleOf") 311 | } 312 | } 313 | } 314 | 315 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kotlin-fundamentals-jetcompose 2 | Kotlin fundamentals for compose 3 | In this project, you'll find a 'MyKotlin' module which contains all of the code we wrote while learning Kotlin basics. 4 | Use this as a reference in your journey to learning Kotlin! 5 | 6 | Good luck! 7 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | id 'kotlin-android' 4 | } 5 | 6 | android { 7 | compileSdk 31 8 | 9 | defaultConfig { 10 | applicationId "com.bawp.myfirstcompose" 11 | minSdk 28 12 | targetSdk 31 13 | versionCode 1 14 | versionName "1.0" 15 | 16 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 17 | vectorDrawables { 18 | useSupportLibrary true 19 | } 20 | } 21 | 22 | buildTypes { 23 | release { 24 | minifyEnabled false 25 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 26 | } 27 | } 28 | compileOptions { 29 | sourceCompatibility JavaVersion.VERSION_1_8 30 | targetCompatibility JavaVersion.VERSION_1_8 31 | } 32 | kotlinOptions { 33 | jvmTarget = '1.8' 34 | useIR = true 35 | } 36 | buildFeatures { 37 | compose true 38 | } 39 | composeOptions { 40 | kotlinCompilerExtensionVersion compose_version 41 | kotlinCompilerVersion '1.5.21' 42 | } 43 | packagingOptions { 44 | resources { 45 | excludes += '/META-INF/{AL2.0,LGPL2.1}' 46 | } 47 | } 48 | } 49 | 50 | dependencies { 51 | 52 | implementation 'androidx.core:core-ktx:1.6.0' 53 | implementation 'androidx.appcompat:appcompat:1.3.1' 54 | implementation 'com.google.android.material:material:1.4.0' 55 | implementation "androidx.compose.ui:ui:$compose_version" 56 | implementation "androidx.compose.material:material:$compose_version" 57 | implementation "androidx.compose.ui:ui-tooling-preview:$compose_version" 58 | implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1' 59 | implementation 'androidx.activity:activity-compose:1.3.1' 60 | testImplementation 'junit:junit:4.+' 61 | androidTestImplementation 'androidx.test.ext:junit:1.1.3' 62 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' 63 | androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version" 64 | debugImplementation "androidx.compose.ui:ui-tooling:$compose_version" 65 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/androidTest/java/com/bawp/myfirstcompose/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.bawp.myfirstcompose 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.bawp.myfirstcompose", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/bawp/myfirstcompose/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.bawp.myfirstcompose 2 | 3 | import android.os.Bundle 4 | import androidx.activity.ComponentActivity 5 | import androidx.activity.compose.setContent 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Surface 8 | import androidx.compose.material.Text 9 | import androidx.compose.runtime.Composable 10 | import androidx.compose.ui.tooling.preview.Preview 11 | import com.bawp.myfirstcompose.ui.theme.MyFirstComposeTheme 12 | 13 | class MainActivity : ComponentActivity() { 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | setContent { 17 | MyFirstComposeTheme { 18 | // A surface container using the 'background' color from the theme 19 | Surface(color = MaterialTheme.colors.background) { 20 | Greeting("Android") 21 | } 22 | } 23 | } 24 | } 25 | } 26 | @Composable 27 | fun Greeting(name: String) { 28 | Text(text = "Hello $name!") 29 | } 30 | 31 | @Preview(showBackground = true) 32 | @Composable 33 | fun DefaultPreview() { 34 | MyFirstComposeTheme { 35 | Greeting("Android") 36 | } 37 | } -------------------------------------------------------------------------------- /app/src/main/java/com/bawp/myfirstcompose/ui/theme/Color.kt: -------------------------------------------------------------------------------- 1 | package com.bawp.myfirstcompose.ui.theme 2 | 3 | import androidx.compose.ui.graphics.Color 4 | 5 | val Purple200 = Color(0xFFBB86FC) 6 | val Purple500 = Color(0xFF6200EE) 7 | val Purple700 = Color(0xFF3700B3) 8 | val Teal200 = Color(0xFF03DAC5) -------------------------------------------------------------------------------- /app/src/main/java/com/bawp/myfirstcompose/ui/theme/Shape.kt: -------------------------------------------------------------------------------- 1 | package com.bawp.myfirstcompose.ui.theme 2 | 3 | import androidx.compose.foundation.shape.RoundedCornerShape 4 | import androidx.compose.material.Shapes 5 | import androidx.compose.ui.unit.dp 6 | 7 | val Shapes = Shapes(small = RoundedCornerShape(4.dp), 8 | medium = RoundedCornerShape(4.dp), 9 | large = RoundedCornerShape(0.dp)) -------------------------------------------------------------------------------- /app/src/main/java/com/bawp/myfirstcompose/ui/theme/Theme.kt: -------------------------------------------------------------------------------- 1 | package com.bawp.myfirstcompose.ui.theme 2 | 3 | import androidx.compose.foundation.isSystemInDarkTheme 4 | import androidx.compose.material.MaterialTheme 5 | import androidx.compose.material.darkColors 6 | import androidx.compose.material.lightColors 7 | import androidx.compose.runtime.Composable 8 | 9 | private val DarkColorPalette = 10 | darkColors(primary = Purple200, primaryVariant = Purple700, secondary = Teal200) 11 | 12 | private val LightColorPalette = 13 | lightColors(primary = Purple500, primaryVariant = Purple700, secondary = Teal200 14 | 15 | /* Other default colors to override 16 | background = Color.White, 17 | surface = Color.White, 18 | onPrimary = Color.White, 19 | onSecondary = Color.Black, 20 | onBackground = Color.Black, 21 | onSurface = Color.Black, 22 | */) 23 | 24 | @Composable 25 | fun MyFirstComposeTheme( 26 | darkTheme: Boolean = isSystemInDarkTheme(), 27 | content: @Composable() () -> Unit 28 | ) { 29 | val colors = if (darkTheme) { 30 | DarkColorPalette 31 | } else { 32 | LightColorPalette 33 | } 34 | 35 | MaterialTheme(colors = colors, typography = Typography, shapes = Shapes, content = content) 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/bawp/myfirstcompose/ui/theme/Type.kt: -------------------------------------------------------------------------------- 1 | package com.bawp.myfirstcompose.ui.theme 2 | 3 | import androidx.compose.material.Typography 4 | import androidx.compose.ui.text.TextStyle 5 | import androidx.compose.ui.text.font.FontFamily 6 | import androidx.compose.ui.text.font.FontWeight 7 | import androidx.compose.ui.unit.sp 8 | 9 | // Set of Material typography styles to start with 10 | val Typography = Typography(body1 = TextStyle(fontFamily = FontFamily.Default, 11 | fontWeight = FontWeight.Normal, 12 | fontSize = 16.sp) 13 | /* Other default text styles to override 14 | button = TextStyle( 15 | fontFamily = FontFamily.Default, 16 | fontWeight = FontWeight.W500, 17 | fontSize = 14.sp 18 | ), 19 | caption = TextStyle( 20 | fontFamily = FontFamily.Default, 21 | fontWeight = FontWeight.Normal, 22 | fontSize = 12.sp 23 | ) 24 | */) -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pdichone/kotlin-fundamentals-jetcompose/bff9a93f9362a470fe70d7a10e3367668c29211f/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pdichone/kotlin-fundamentals-jetcompose/bff9a93f9362a470fe70d7a10e3367668c29211f/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pdichone/kotlin-fundamentals-jetcompose/bff9a93f9362a470fe70d7a10e3367668c29211f/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pdichone/kotlin-fundamentals-jetcompose/bff9a93f9362a470fe70d7a10e3367668c29211f/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pdichone/kotlin-fundamentals-jetcompose/bff9a93f9362a470fe70d7a10e3367668c29211f/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pdichone/kotlin-fundamentals-jetcompose/bff9a93f9362a470fe70d7a10e3367668c29211f/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pdichone/kotlin-fundamentals-jetcompose/bff9a93f9362a470fe70d7a10e3367668c29211f/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pdichone/kotlin-fundamentals-jetcompose/bff9a93f9362a470fe70d7a10e3367668c29211f/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pdichone/kotlin-fundamentals-jetcompose/bff9a93f9362a470fe70d7a10e3367668c29211f/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pdichone/kotlin-fundamentals-jetcompose/bff9a93f9362a470fe70d7a10e3367668c29211f/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | MyFirstCompose 3 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 21 | 22 |