├── .gitignore ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── github │ │ └── olegosipenko │ │ └── kointestsample │ │ ├── EmailLoginFragmentTest.kt │ │ └── bootstrap │ │ └── KoinTestRunner.kt │ ├── debug │ └── AndroidManifest.xml │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── github │ │ └── olegosipenko │ │ └── kointestsample │ │ ├── EmailFragmentView.kt │ │ ├── EmailLoginFragment.kt │ │ ├── EmailLoginFragmentViewModel.kt │ │ ├── EmailLoginViewState.kt │ │ ├── KoinApp.kt │ │ └── MainActivity.kt │ └── res │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ ├── gradient.xml │ ├── ic_launcher_background.xml │ └── scenic.jpg │ ├── layout │ ├── activity_main.xml │ └── fragment_email_login.xml │ ├── menu │ └── menu_main.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── buildSrc ├── build.gradle.kts └── src │ └── main │ └── java │ └── Dependencies.kt ├── config └── detekt │ └── detekt.yml ├── detekt-rules ├── .gitignore ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── github │ │ │ └── olegosipenko │ │ │ └── detektrules │ │ │ ├── CustomRulesetProvider.kt │ │ │ └── NonExhaustiveWhen.kt │ └── resources │ │ └── META-INF │ │ └── services │ │ └── io.gitlab.arturbosch.detekt.api.RuleSetProvider │ └── test │ └── java │ └── com │ └── github │ └── olegosipenko │ └── detektrules │ └── NonExhaustiveWhenTest.kt ├── 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 | /app/google-services.json 15 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | apply plugin: 'kotlin-android' 4 | 5 | apply plugin: 'io.gitlab.arturbosch.detekt' 6 | 7 | apply plugin: 'dagger.hilt.android.plugin' 8 | 9 | apply plugin: 'kotlin-kapt' 10 | 11 | apply plugin: "com.google.gms.google-services" 12 | 13 | android { 14 | compileSdkVersion 33 15 | defaultConfig { 16 | applicationId "com.github.olegosipenko.kointestsample" 17 | minSdkVersion 21 18 | targetSdkVersion 33 19 | versionCode 1 20 | versionName "1.0" 21 | testInstrumentationRunner "com.github.olegosipenko.kointestsample.bootstrap.KoinTestRunner" 22 | } 23 | buildTypes { 24 | release { 25 | minifyEnabled false 26 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 27 | } 28 | } 29 | 30 | testOptions { 31 | animationsDisabled = true 32 | } 33 | 34 | kapt { 35 | correctErrorTypes true 36 | } 37 | 38 | compileOptions { 39 | sourceCompatibility JavaVersion.VERSION_1_8 40 | targetCompatibility JavaVersion.VERSION_1_8 41 | } 42 | 43 | kotlinOptions { 44 | jvmTarget = "1.8" 45 | } 46 | 47 | buildFeatures { 48 | compose true 49 | } 50 | 51 | composeOptions { 52 | kotlinCompilerExtensionVersion '1.4.7' 53 | } 54 | 55 | packagingOptions { 56 | exclude 'META-INF/DEPENDENCIES' 57 | exclude 'META-INF/LICENSE' 58 | exclude 'META-INF/LICENSE.txt' 59 | exclude 'META-INF/license.txt' 60 | exclude 'META-INF/NOTICE' 61 | exclude 'META-INF/NOTICE.txt' 62 | exclude 'META-INF/notice.txt' 63 | exclude 'META-INF/ASL2.0' 64 | exclude 'META-INF/AL2.0' 65 | exclude 'META-INF/LGPL2.1' 66 | exclude 'META-INF/LICENSE.md' 67 | exclude 'META-INF/LICENSE-notice.md' 68 | } 69 | 70 | buildFeatures { 71 | viewBinding = true 72 | } 73 | } 74 | 75 | detekt { 76 | reports { 77 | xml { 78 | enabled = false 79 | } 80 | txt { 81 | enabled = false 82 | } 83 | } 84 | } 85 | 86 | dependencies { 87 | implementation Libs.kotlin 88 | implementation Libs.appCompat 89 | implementation Libs.coreKtx 90 | implementation Libs.constraintLayout 91 | implementation Libs.material 92 | implementation Libs.viewModelKtx 93 | 94 | implementation Libs.activityCompose 95 | // Compose Material Design 96 | implementation Libs.composeMaterial 97 | // Animations 98 | implementation Libs.composeAnimation 99 | // Tooling support (Previews, etc.) 100 | implementation Libs.composeTooling 101 | // Integration with ViewModels 102 | implementation Libs.composeViewModel 103 | implementation Libs.composeConstraint 104 | 105 | implementation Libs.hiltAndroid 106 | kapt Libs.hiltCompiler 107 | 108 | detekt project(":detekt-rules") 109 | detekt Libs.detektCli 110 | 111 | implementation(platform(Libs.firebaseBom)) 112 | 113 | androidTestImplementation Libs.testRunner 114 | androidTestImplementation Libs.espressoCore 115 | androidTestImplementation Libs.testRules 116 | androidTestImplementation Libs.mockkAndroid 117 | androidTestImplementation Libs.kakao 118 | androidTestImplementation Libs.hiltInstrumentation 119 | kaptAndroidTest Libs.hiltCompiler 120 | androidTestAnnotationProcessor Libs.hiltCompiler 121 | androidTestImplementation Libs.composeTest 122 | androidTestImplementation Libs.composeJUnit 123 | androidTestImplementation Libs.fragmentTesting 124 | } 125 | -------------------------------------------------------------------------------- /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 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/github/olegosipenko/kointestsample/EmailLoginFragmentTest.kt: -------------------------------------------------------------------------------- 1 | package com.github.olegosipenko.kointestsample 2 | 3 | import android.util.Log 4 | import androidx.compose.ui.test.SemanticsNodeInteractionsProvider 5 | import androidx.compose.ui.test.junit4.createAndroidComposeRule 6 | import androidx.test.espresso.action.ViewActions.typeText 7 | import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner 8 | import dagger.hilt.android.testing.BindValue 9 | import dagger.hilt.android.testing.HiltAndroidRule 10 | import dagger.hilt.android.testing.HiltAndroidTest 11 | import io.github.kakaocup.compose.node.element.ComposeScreen 12 | import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen 13 | import io.github.kakaocup.compose.node.element.KNode 14 | import io.mockk.every 15 | import io.mockk.mockk 16 | import io.mockk.verify 17 | import org.junit.Before 18 | import org.junit.Rule 19 | import org.junit.Test 20 | import org.junit.runner.RunWith 21 | 22 | @HiltAndroidTest 23 | @RunWith(AndroidJUnit4ClassRunner::class) 24 | class EmailLoginFragmentTest { 25 | @get:Rule(order = 0) 26 | var hiltRule = HiltAndroidRule(this) 27 | 28 | @get:Rule(order = 1) 29 | val composeTestRule = createAndroidComposeRule() 30 | 31 | @BindValue 32 | @JvmField 33 | val fragmentViewModel: EmailLoginFragmentViewModel = mockk(relaxed = true) 34 | 35 | @Before 36 | fun init() { 37 | hiltRule.inject() 38 | } 39 | 40 | @Test 41 | fun testBasicInvocation() { 42 | onComposeScreen(composeTestRule) { 43 | emailField { performTextInput(EMAIL) } 44 | passwordField { performTextInput(PASSWORD) } 45 | loginButton { performClick() } 46 | 47 | verify { 48 | fragmentViewModel.loginWithCredentials(EMAIL, PASSWORD) 49 | } 50 | } 51 | } 52 | 53 | class EmailLoginForm( 54 | semanticsProvider: SemanticsNodeInteractionsProvider 55 | ) : ComposeScreen(semanticsProvider) { 56 | val emailField: KNode = child { hasTestTag("email-field") } 57 | val passwordField: KNode = child { hasTestTag("password-field") } 58 | val loginButton: KNode = child { hasTestTag("button") } 59 | } 60 | } 61 | 62 | private const val EMAIL = "some@email.com" 63 | private const val PASSWORD = "password" -------------------------------------------------------------------------------- /app/src/androidTest/java/com/github/olegosipenko/kointestsample/bootstrap/KoinTestRunner.kt: -------------------------------------------------------------------------------- 1 | package com.github.olegosipenko.kointestsample.bootstrap 2 | 3 | import android.app.Application 4 | import android.content.Context 5 | import androidx.test.runner.AndroidJUnitRunner 6 | import dagger.hilt.android.testing.HiltTestApplication 7 | 8 | class KoinTestRunner: AndroidJUnitRunner() { 9 | override fun newApplication( 10 | cl: ClassLoader?, className: String?, context: Context? 11 | ): Application { 12 | return super.newApplication( 13 | cl, HiltTestApplication::class.java.name, context 14 | ) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 14 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/github/olegosipenko/kointestsample/EmailFragmentView.kt: -------------------------------------------------------------------------------- 1 | package com.github.olegosipenko.kointestsample 2 | 3 | import androidx.compose.foundation.Image 4 | import androidx.compose.foundation.background 5 | import androidx.compose.foundation.layout.Box 6 | import androidx.compose.foundation.layout.fillMaxSize 7 | import androidx.compose.material.Button 8 | import androidx.compose.material.Text 9 | import androidx.compose.material.TextField 10 | import androidx.compose.runtime.Composable 11 | import androidx.compose.runtime.getValue 12 | import androidx.compose.runtime.mutableStateOf 13 | import androidx.compose.runtime.remember 14 | import androidx.compose.runtime.setValue 15 | import androidx.compose.ui.Modifier 16 | import androidx.compose.ui.graphics.Brush 17 | import androidx.compose.ui.graphics.Color 18 | import androidx.compose.ui.layout.ContentScale 19 | import androidx.compose.ui.res.painterResource 20 | import androidx.compose.ui.semantics.semantics 21 | import androidx.compose.ui.semantics.testTag 22 | import androidx.compose.ui.text.input.TextFieldValue 23 | import androidx.compose.ui.tooling.preview.Preview 24 | import androidx.constraintlayout.compose.ChainStyle 25 | import androidx.constraintlayout.compose.ConstraintLayout 26 | import androidx.constraintlayout.compose.Dimension 27 | 28 | @Composable 29 | fun EmailLoginFragmentView(clickListener: (String, String) -> Unit) { 30 | var emailState by remember { mutableStateOf(TextFieldValue()) } 31 | var passwordState by remember { mutableStateOf(TextFieldValue()) } 32 | ConstraintLayout( 33 | modifier = Modifier.fillMaxSize() 34 | ) { 35 | val (email, password, button) = createRefs() 36 | 37 | createVerticalChain(email, password, button, chainStyle = ChainStyle.Packed) 38 | 39 | Image( 40 | painter = painterResource(id = R.drawable.scenic), 41 | contentDescription = "scenery background", 42 | modifier = Modifier.fillMaxSize(), 43 | contentScale = ContentScale.Crop 44 | ) 45 | Box( 46 | modifier = Modifier 47 | .fillMaxSize() 48 | .background( 49 | brush = Brush.verticalGradient( 50 | colors = listOf( 51 | Color.Transparent, 52 | Color.White 53 | ) 54 | ) 55 | ) 56 | ) 57 | TextField( 58 | modifier = Modifier 59 | .constrainAs(email) { 60 | top.linkTo(parent.top) 61 | bottom.linkTo(password.top) 62 | start.linkTo(parent.start) 63 | end.linkTo(parent.end) 64 | } 65 | .semantics { testTag = "email-field" }, 66 | label = { 67 | Text(text = "E-mail") 68 | }, 69 | value = emailState, 70 | onValueChange = { 71 | emailState = it 72 | } 73 | ) 74 | TextField( 75 | modifier = Modifier 76 | .constrainAs(password) { 77 | top.linkTo(email.bottom) 78 | bottom.linkTo(button.top) 79 | start.linkTo(parent.start) 80 | end.linkTo(parent.end) 81 | } 82 | .semantics { testTag = "password-field" }, 83 | label = { 84 | Text(text = "password") 85 | }, 86 | value = passwordState, 87 | onValueChange = { 88 | passwordState = it 89 | } 90 | ) 91 | Button( 92 | modifier = Modifier 93 | .constrainAs(button) { 94 | width = Dimension.fillToConstraints 95 | start.linkTo(email.start) 96 | end.linkTo(email.end) 97 | top.linkTo(password.bottom) 98 | bottom.linkTo(parent.bottom) 99 | } 100 | .semantics { testTag = "button" }, 101 | onClick = { 102 | clickListener.invoke( 103 | emailState.text, passwordState.text 104 | ) 105 | } 106 | ) { 107 | Text(text = "Login") 108 | } 109 | } 110 | } 111 | 112 | @Preview 113 | @Composable 114 | fun PreviewFragment() { 115 | EmailLoginFragmentView { _, _ -> } 116 | } 117 | -------------------------------------------------------------------------------- /app/src/main/java/com/github/olegosipenko/kointestsample/EmailLoginFragment.kt: -------------------------------------------------------------------------------- 1 | package com.github.olegosipenko.kointestsample 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.compose.material.MaterialTheme 8 | import androidx.compose.ui.platform.ViewCompositionStrategy 9 | import androidx.fragment.app.Fragment 10 | import androidx.fragment.app.viewModels 11 | import com.github.olegosipenko.kointestsample.databinding.FragmentEmailLoginBinding 12 | import dagger.hilt.android.AndroidEntryPoint 13 | 14 | @AndroidEntryPoint 15 | class EmailLoginFragment: Fragment() { 16 | 17 | private val fragmentViewModel: EmailLoginFragmentViewModel by viewModels() 18 | private var _viewBinding: FragmentEmailLoginBinding? = null 19 | private val viewBinding get() = requireNotNull(_viewBinding) 20 | 21 | override fun onCreateView(inflater: LayoutInflater, 22 | container: ViewGroup?, 23 | savedInstanceState: Bundle? 24 | ): View { 25 | _viewBinding = FragmentEmailLoginBinding.inflate(inflater, container, false) 26 | return viewBinding.root 27 | } 28 | 29 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 30 | super.onViewCreated(view, savedInstanceState) 31 | viewBinding.composeView.apply { 32 | setViewCompositionStrategy( 33 | ViewCompositionStrategy.DisposeOnLifecycleDestroyed(viewLifecycleOwner) 34 | ) 35 | setContent { 36 | MaterialTheme { 37 | EmailLoginFragmentView(::onLoginClick) 38 | } 39 | } 40 | } 41 | } 42 | 43 | private fun onLoginClick(email: String, password: String) { 44 | fragmentViewModel.loginWithCredentials(email, password) 45 | } 46 | 47 | override fun onDestroyView() { 48 | super.onDestroyView() 49 | _viewBinding = null 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/github/olegosipenko/kointestsample/EmailLoginFragmentViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.github.olegosipenko.kointestsample 2 | 3 | import android.util.Log 4 | import androidx.lifecycle.ViewModel 5 | import dagger.hilt.android.lifecycle.HiltViewModel 6 | import javax.inject.Inject 7 | 8 | @HiltViewModel 9 | class EmailLoginFragmentViewModel @Inject constructor() : ViewModel() { 10 | fun loginWithCredentials(email: String, password: String) { 11 | Log.d(this.javaClass.name, "login with:$email, $password") 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/github/olegosipenko/kointestsample/EmailLoginViewState.kt: -------------------------------------------------------------------------------- 1 | package com.github.olegosipenko.kointestsample 2 | 3 | sealed class EmailLoginViewState { 4 | object INITIAL: EmailLoginViewState() 5 | object LOADING: EmailLoginViewState() 6 | object SUCCESS: EmailLoginViewState() 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/github/olegosipenko/kointestsample/KoinApp.kt: -------------------------------------------------------------------------------- 1 | package com.github.olegosipenko.kointestsample 2 | 3 | import android.app.Application 4 | import dagger.hilt.android.HiltAndroidApp 5 | 6 | @HiltAndroidApp 7 | class KoinApp: Application() { 8 | override fun onCreate() { 9 | super.onCreate() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/github/olegosipenko/kointestsample/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.github.olegosipenko.kointestsample 2 | 3 | import android.graphics.Color 4 | import android.os.Build 5 | import android.os.Bundle 6 | import android.view.View 7 | import android.view.Window 8 | import android.view.WindowInsetsController 9 | import androidx.appcompat.app.AppCompatActivity; 10 | import androidx.core.view.WindowCompat 11 | import dagger.hilt.android.AndroidEntryPoint 12 | 13 | @AndroidEntryPoint 14 | class MainActivity: AppCompatActivity() { 15 | 16 | override fun onCreate(savedInstanceState: Bundle?) { 17 | super.onCreate(savedInstanceState) 18 | setContentView(R.layout.activity_main) 19 | WindowCompat.setDecorFitsSystemWindows(window, false) 20 | window.statusBarColor = Color.TRANSPARENT 21 | window.setStatusBarDarkIcons(true) 22 | } 23 | 24 | @Suppress("DEPRECATION") 25 | fun Window.setStatusBarDarkIcons(dark: Boolean) { 26 | when { 27 | Build.VERSION_CODES.R <= Build.VERSION.SDK_INT -> insetsController?.setSystemBarsAppearance( 28 | if (dark) WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS else 0, 29 | WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS 30 | ) 31 | Build.VERSION_CODES.M <= Build.VERSION.SDK_INT -> decorView.systemUiVisibility = if (dark) { 32 | decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 33 | } else { 34 | decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() 35 | } 36 | else -> if (dark) { 37 | // dark status bar icons not supported on API level below 23, set status bar 38 | // color to black to keep icons visible 39 | statusBarColor = Color.BLACK 40 | } 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/gradient.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 28 | 30 | 32 | 34 | 36 | 38 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 | 62 | 64 | 66 | 68 | 70 | 72 | 74 | 75 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/scenic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olegosipenko/SamplesApp/e763df939d129123cf7f22f1280179e0dc66437e/app/src/main/res/drawable/scenic.jpg -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_email_login.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_main.xml: -------------------------------------------------------------------------------- 1 | 5 | 9 | 10 | -------------------------------------------------------------------------------- /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.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olegosipenko/SamplesApp/e763df939d129123cf7f22f1280179e0dc66437e/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olegosipenko/SamplesApp/e763df939d129123cf7f22f1280179e0dc66437e/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olegosipenko/SamplesApp/e763df939d129123cf7f22f1280179e0dc66437e/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olegosipenko/SamplesApp/e763df939d129123cf7f22f1280179e0dc66437e/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olegosipenko/SamplesApp/e763df939d129123cf7f22f1280179e0dc66437e/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olegosipenko/SamplesApp/e763df939d129123cf7f22f1280179e0dc66437e/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olegosipenko/SamplesApp/e763df939d129123cf7f22f1280179e0dc66437e/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olegosipenko/SamplesApp/e763df939d129123cf7f22f1280179e0dc66437e/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olegosipenko/SamplesApp/e763df939d129123cf7f22f1280179e0dc66437e/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olegosipenko/SamplesApp/e763df939d129123cf7f22f1280179e0dc66437e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16dp 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | KoinTestApp 3 | Settings 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 |